Status: Project Abandoned - Phase 2.1 RSS Feed Frontend (In Progress)
Last Updated: June 7, 2026
Duha Brain is a personal knowledge management system built with Go backend and React/TypeScript frontend. The project implements a notebook application with rich text editing and RSS feed aggregation capabilities.
Tech Stack:
- Backend: Go with SQLite database
- Frontend: React 18 + TypeScript + Tailwind CSS + Vite
- Editor: TipTap (rich text)
- State Management: Zustand
- Styling: Tailwind CSS with dark theme (slate colors)
- Fonts: Inter (UI/Navigation), JetBrains Mono (code/editing)
Backend:
- Go REST API with SQLite database
- CRUD operations for notes
- Image upload endpoint (
/api/v1/images) - Note tagging system
- Note type system (thought, snippet, article, voice, image, video, meeting, jira, goal, feed)
Frontend:
- React + TypeScript + Tailwind CSS + Vite
- Rich text editor using TipTap with:
- Text formatting (bold, italic, strikethrough)
- Heading levels (H1, H2, H3)
- Lists (bullet and ordered)
- Code blocks
- Image embedding (paste or upload)
- Link support
- Tag system with inline extraction (
#tagsyntax) - Auto-save functionality (2-second debounce)
- Tab-based notebook management
- Search functionality
- Dark theme with smooth animations
- Title auto-formatting to title case
Database Schema:
CREATE TABLE notes (
id TEXT PRIMARY KEY,
title TEXT,
content TEXT,
type TEXT,
tags TEXT,
source TEXT,
created_at DATETIME,
updated_at DATETIME
);Features:
- Feed subscription management (add, delete, list, update)
- RSS/Atom feed parsing using
gofeedlibrary - Feed article fetching and caching
- Manual feed refresh
- Save articles to database
Database Schema:
CREATE TABLE feeds (
id TEXT PRIMARY KEY,
title TEXT,
url TEXT,
description TEXT,
created_at DATETIME,
updated_at DATETIME
);
CREATE TABLE feed_items (
id TEXT PRIMARY KEY,
feed_id TEXT,
title TEXT,
description TEXT,
content TEXT,
link TEXT,
author TEXT,
pub_date DATETIME,
fetched_at DATETIME,
is_saved BOOLEAN,
FOREIGN KEY (feed_id) REFERENCES feeds(id)
);API Endpoints:
POST /api/v1/feeds- Add new feedGET /api/v1/feeds- List all feedsPUT /api/v1/feeds/:id- Update feedDELETE /api/v1/feeds/:id- Delete feedGET /api/v1/feeds/:id/items- Get articles from feedPOST /api/v1/feeds/:id/refresh- Refresh feedGET /api/v1/feed-items/recent- Get recent articlesPOST /api/v1/feed-items/:id/save- Mark article as read
Components Created:
FeedsPage.tsx- Main feeds UI component- Left: Article feed (Facebook/LinkedIn style)
- Right: Feed configuration panel with tabs (Feed | Configurations)
Features Attempted:
- Article display with clean titles (removes arXiv IDs)
- Mark as read functionality
- Add article to notebooks button
- Feed subscription management
- 11 pre-loaded default feeds
Pre-loaded Default Feeds:
- MarkTechPost - https://www.marktechpost.com/feed/
- OpenAI News - https://openai.com/news/rss.xml
- Hugging Face Blog - https://huggingface.co/blog/feed.xml
- MIT Technology Review (AI) - https://www.technologyreview.com/topic/artificial-intelligence/feed/
- arXiv cs.AI - https://rss.arxiv.org/rss/cs.AI
- Hacker News - https://hnrss.org/frontpage?points=100
- The Pragmatic Engineer - https://blog.pragmaticengineer.com/rss/
- GitHub Blog - https://github.blog/feed/
- Simon Willison's Weblog - https://simonwillison.net/atom/entries/
- TechCrunch - https://techcrunch.com/feed/
- GMA Public Affairs - https://data.gmanetwork.com/gno/rss/publicaffairs/feed.xml
Last Status: Project failing - needs debugging
- Date: June 7, 2026
- Frontend builds successfully (npm run build)
- Backend builds successfully (go build)
- Runtime failure when accessing application
-
FeedsPage Component Issues
- Complex state management with tab switching
- Potential memory leaks in useEffect hooks
- Feed items loading logic may have issues
-
Transition Animations
- Added
animate-fadeInkeyframe animation transition-all duration-200on multiple elements- May be causing performance issues or conflicts
- Added
-
CSS Modifications
- Added global transitions in
index.css - New
@keyframes fadeInanimation - Potential Tailwind conflicts
- Added global transitions in
-
Notebook Selection Bug (Fixed)
- Issue: Clicking different notebooks showed only latest notebook content
- Fix: Added
useEffectinRichNoteEditor.tsxto update editor when note changes - Fix Applied:
useEffect(() => { // Update editor content when note changes if (editor && note) { editor.commands.setContent(note.content) contentRef.current = note.content setEditingTitle(note.title) setIsEditing(false) setLastSaveTime(null) } }, [note.id, editor])
-
Browser Console
- Check for JavaScript errors
- Look for API call failures
- Check network tab for failed requests
-
Backend
- Verify server is running on
localhost:8080 - Check Go server logs for panics
- Verify database file exists at
data/duha.db - Test API endpoints with curl:
curl http://localhost:8080/api/v1/notes curl http://localhost:8080/api/v1/feeds
- Verify server is running on
-
Frontend
- Check if React is mounting properly
- Verify Zustand store is initialized
- Look for missing API responses
- Test in different browser
-
Recent Changes to Review
web/src/components/FeedsPage.tsx- Entire componentweb/src/components/RichNoteEditor.tsx- Added notebook selection fixweb/src/index.css- Added fadeIn animation and transitions
duha-brain/
├── cmd/
│ └── duha-brain/
│ └── main.go (Entry point)
├── internal/
│ ├── api/
│ │ ├── handlers.go (Note endpoints)
│ │ ├── feed_handlers.go (Feed endpoints)
│ │ └── router.go (Route setup)
│ ├── config/
│ │ └── config.go
│ ├── database/
│ │ └── db.go (SQLite setup)
│ ├── models/
│ │ ├── note.go
│ │ └── feed.go
│ ├── services/
│ │ └── feed_parser.go (RSS parsing)
│ ├── storage/
│ │ ├── note_store.go (Note DB ops)
│ │ └── feed_store.go (Feed DB ops)
│ └── utils/
│ ├── errors.go
│ └── logger.go
├── web/
│ ├── src/
│ │ ├── components/
│ │ │ ├── App.tsx (Main app)
│ │ │ ├── RichNoteEditor.tsx (Editor)
│ │ │ ├── NoteForm.tsx (New note)
│ │ │ ├── NoteList.tsx (Notes sidebar)
│ │ │ ├── FeedsPage.tsx (RSS feeds UI)
│ │ │ ├── Sidebar.tsx (Navigation)
│ │ │ └── Toast.tsx (Notifications)
│ │ ├── types/
│ │ │ ├── index.ts
│ │ │ └── feed.ts
│ │ ├── utils/
│ │ │ └── text.ts (Helper functions)
│ │ ├── api.ts (API client)
│ │ ├── store.ts (Zustand store)
│ │ ├── App.tsx
│ │ ├── index.css
│ │ └── main.tsx
│ ├── package.json
│ ├── vite.config.ts
│ └── tsconfig.json
├── data/
│ ├── duha.db (SQLite database)
│ └── images/ (User-uploaded images)
├── go.mod
├── go.sum
└── Makefile
Base URL: http://localhost:8080
Note Endpoints:
GET /api/v1/notes- List notes (with search)POST /api/v1/notes- Create notePUT /api/v1/notes/:id- Update noteDELETE /api/v1/notes/:id- Delete notePOST /api/v1/images- Upload image
Feed Endpoints:
GET /api/v1/feeds- List feedsPOST /api/v1/feeds- Add feedPUT /api/v1/feeds/:id- Update feedDELETE /api/v1/feeds/:id- Delete feedGET /api/v1/feeds/:id/items- Get feed itemsPOST /api/v1/feeds/:id/refresh- Refresh feedGET /api/v1/feed-items/recent- Get recent itemsPOST /api/v1/feed-items/:id/save- Save/mark as read
CRITICAL: Everything must have smooth transitions
-
Fonts
- UI/Navigation:
Interfont family - Code/Editing:
JetBrains Monofont family
- UI/Navigation:
-
Transitions
- All interactive elements:
transition-all 200ms cubic-bezier(0.4, 0, 0.2, 1) - Specific transitions preferred over
transition-allto avoid performance issues - Use
transition-colors,transition-opacity,transition-transformfor GPU acceleration - Duration: Always 200ms for consistency
- All interactive elements:
-
Colors
- Dark theme: Slate color palette (slate-950, slate-900, slate-800, etc.)
- Accent: Blue (blue-600 hover, blue-700 active)
- Success: Green (green-600, emerald-600)
- Danger: Red (red-400, red-900)
-
Button Styling
- Smooth hover:
hover:scale-105 active:scale-95(WARNING: Can cause performance issues) - Better alternative: Use only color changes with
transition-colors - Always include
transition-colors duration-200
- Smooth hover:
-
Component Rules
- Never touch notebooks code unless explicitly fixing it
- Create separate files for new features
- Don't modify existing core files unnecessarily
- Minimize prop changes to avoid unnecessary re-renders
- Go 1.18+
- Node.js 18+
- npm or yarn
Backend:
cd duha-brain
go build -o bin/duha-brain.exe ./cmd/duha-brain/main.go
./bin/duha-brain.exeFrontend:
cd duha-brain/web
npm install
npm run dev # Development server
npm run build # Production buildFrontend:
npm run build # Compiles TypeScript and ViteBackend:
go build -o bin/duha-brain.exe ./cmd/duha-brain/main.go- ❌ Background feed polling (auto-refresh every 30 minutes)
- ❌ Audio transcription
- ❌ Image OCR
- ❌ Video transcription
- ❌ LLM integration
- ❌ Knowledge graph
- ❌ Advanced views (calendar, Gantt, timeline)
- ❌ Feed sync across devices
- ❌ Full-text search
- ❌ Export functionality
- Rich text editor integration (TipTap)
- Image embedding and storage
- Tag extraction from content
- Auto-save functionality
- Dark theme with smooth animations
- React component organization
- Zustand state management
- SQLite database integration
- FeedsPage component complexity
- Performance optimization for large feed lists
- Error handling could be more robust
- Missing loading states on async operations
- No pagination for articles
- Memory management in long sessions
- Transition Performance:
transition-allcan cause performance issues. Use specific transitions instead. - Editor State Management: TipTap editor needs proper dependency tracking to update on prop changes.
- Component Isolation: Keep new features in separate files to avoid breaking existing functionality.
- Golden Rules: Establish and follow UI rules early (smooth transitions, consistent timing, etc.)
- Build Verification: Always build both frontend and backend after changes to catch issues early.
web/src/components/FeedsPage.tsx- RSS feeds UI component
web/src/components/RichNoteEditor.tsx- Fixed notebook selection bugweb/src/App.tsx- Integrated Feeds page toggleweb/src/index.css- Added fadeIn animationweb/src/components/Sidebar.tsx- Added Feeds navigation
- All RSS frontend components except FeedsPage
- Debugging: Start with browser console and network tab to identify the exact failure point
- Testing: Add unit tests for API endpoints and React components
- Performance: Implement virtualization for large article lists
- Refactoring: Break FeedsPage into smaller components (FeedList, ArticleCard, ConfigPanel)
- Documentation: Add JSDoc comments to complex functions
- CI/CD: Set up automated builds and tests
Project: Duha Brain Personal Knowledge Management System Status: Abandoned (June 7, 2026) Reason: Project failure during Phase 2.1 frontend implementation - debugging required
Technology Attribution:
- TipTap (tiptap.dev) - Rich text editor
- gofeed (github.com/mmcdole/gofeed) - RSS/Atom parsing
- Tailwind CSS (tailwindcss.com) - Styling
- React (react.dev) - Frontend framework
- Zustand (github.com/pmndrs/zustand) - State management
End of Documentation