UnThink
Fragment-first personal knowledge base for engineers.
Problem
Every save tool requires a context switch, and the friction is high enough that engineers don't bother capturing what they learn.
Built
Dual-backend (Django and FastAPI) with Celery coordinating three queues. AI classifies and organizes every fragment automatically. Browser extension as primary capture interface.
<300ms
Django save API
model-agnostic
AI layer
<$100/mo
per 1k users
3
Celery task queues
The build
[Idea]
UnThink started from frustration with my own note-taking. I'd save a snippet, then never open it again. The friction of 'pick a folder, write a tag' was high enough that I'd skip capturing things entirely. The whole product idea is: don't make me name anything. The unit of saving is a fragment, two to four lines, not a page, and the AI figures out the folder and tags.
[Framing]
The architectural decision that shaped everything else was the dual backend. Django handles auth, quota, and the save API, with under 300ms return so the browser extension feels snappy. FastAPI handles the AI classification pipeline and the SSE stream that updates the dashboard when classification completes. They talk via Redis pub/sub and Celery (three queues, classification, scraping, and reports) and never call each other directly. This split exists because Django is great for relational CRUD and FastAPI is great for streaming LLM responses. Using one for both was tempting but wrong.
[Build]
SSE over WebSocket was an early call. We don't need bidirectional, and SSE just works through any HTTP proxy. The browser extension (Manifest V3, Chromium only) is the primary capture interface. Right-click on selected text, hit Send to UnThink, done. The folder taxonomy is the part I'm proudest of. Every fragment lands in exactly two folders, a topic folder like Tech/DevOps/Redis and a source folder from the page title. Tags equal folder membership, so editing a tag later is just moving the fragment between folders.
[Deploy]
Quota limits are honest. 25 right-click saves a day, 250 a month. I'd rather have a clear ceiling than a vague fair-use line. We're still in development, but the capture, classify, and file loop is solid.
[What's next]
What's next. Replacing the Jina and Firecrawl fallback scrapers with a single in-house crawler, plus an offline mode for the extension.
Stack
7 techs · grouped by layerBackend
- FastAPI
- Celery
- SSE
Infrastructure
- Docker
Data layer
- PostgreSQL
- Redis
AI / special
- Gemini
Also used
Related writing
7 posts reference UnThink- Linux Networking for Backend Engineers. Part 1: Namespaces and Virtual Interfaces
medium · 10 min read · linux · networking · docker · internals
- Linux Networking. Part 2: Communication From Namespace to Host Through Virtual Ethernet
medium · 9 min read · linux · networking · namespaces · veth
- Linux Networking. Part 3: Bridge and Default Gateway for One-Way Outbound Communication
medium · 8 min read · linux · networking · bridge · gateway
- Linux Networking. Part 4: SNAT and Packet Forwarding to Connect to the Internet From a Namespace
medium · 9 min read · linux · networking · nat · iptables
- Your Easy Guide to Design Highly Available Systems With Redis. Part 1
medium · 8 min read · redis · high-availability · cache · distributed
- Step-by-Step Guide to Deploy Redis Cluster in AWS to Achieve High Availability. Part 2
medium · 10 min read · redis · aws · cluster · high-availability
- Linux Networking for Backend Engineers. Part 1: Namespaces and Virtual Interfaces
native · 10 min read · linux · networking · docker · internals