Brainstorm sink — not commitments. Captured 2026-05-26.
The current pipeline is ingest → classify → consolidate → summarize → embed → wiki. The wiki is just one possible sink. The same pipeline can power several different products on top of the same DB.
Aggregate queries over SyncRun, Highlight.highlighted_at, Highlight.source_title to surface:
- "You highlight 3x more on weekends"
- "Your topic spread shifted from tech → philosophy this quarter"
- "You've stopped highlighting fiction since March"
Pure SQL. No new LLM cost. Adds a "Patterns" tab to the existing UI.
Topic.related_topics (M2M) is already a graph. Render with cytoscape.js or d3.force. Edge weights from co-occurrence counts. Nodes sized by highlight count. Click a node to drill into the topic page.
For each new highlight, compute cosine distance to existing topic centroids via pgvector. Highlights that don't fit any cluster well = potentially the most novel things you've read. Surface as a "What surprised you this week" section.
Embed book metadata (title + blurb), match against the user's top-N insight cluster centroids. "Because you've been highlighting around Plans fail under uncertainty, you might like Antifragile." Needs a books corpus — could seed from Readwise's "to-read" list or Goodreads.
Long-term: let users configure their own pipeline stages. A "step" is just a function taking highlights/topics and producing a side effect. UI would be a node-graph editor like n8n / Zapier. Big lift but the building blocks (LLMCall, batched tasks, Celery chains) are already there.
Today the app uses a single hardcoded READWISE_TOKEN from env. To open it up to other users:
Readwise has no OAuth — they use personal access tokens at readwise.io/access_token. Standard pattern:
- User signs up via Django auth (or
django-allauthfor Google/GitHub social login) - After signup, prompted to paste their Readwise token
- Token stored encrypted (
django-encrypted-fieldsorcryptography.fernet)
Add user = ForeignKey(User, on_delete=CASCADE) to:
HighlightTopicSyncRunClassificationBatchLLMCall
Scope every queryset to request.user. Migrate existing data to a single "you" user.
sync_readwise_tasktakesuser_idarg- Build
ReadwiseClientfrom the user's stored token, notsettings.READWISE_TOKEN - Beat schedule iterates:
for user in User.objects.all(): sync_readwise_task.delay(user.id)
LLM cost scales linearly with users. With 10 users × 100 highlights × daily sync ≈ $150–600/month at current model rates. Before opening signups:
- Per-user spend cap (track via
LLMCall.cost_estimate_usdaggregation) - Free-tier limit (e.g., 50 highlights/day classified, weekly sync)
- Stripe +
Planmodel with quotas
~1-2 weeks done well. The architecture supports it cleanly — add the FK, scope the queries, parameterize the sync. The cost layer is the bigger product question.
These are all real opportunities, but they're product moves not portfolio moves. The current single-user wiki is a good portfolio piece as-is. Pursuing the above turns this into a real product with users, billing, support, etc. — worth doing if that's the goal, not worth doing for the demo.