blonk is a radar for your web, where you follow vibes for cool blips on the radar
Claude Development Notes - Blonk#
Session 1: Initial Setup & Renaming Posts to Blips#
Why This Step#
- User wants unique terminology: "blips on the blonk vibe radar"
- This creates a distinct brand identity separate from Reddit/Twitter/Bluesky
- Makes the app feel more original and fun
Implementation Details#
- Renaming all instances of "post" to "blip" across:
- Schema definitions (POST_NSID → BLIP_NSID)
- Type interfaces (BlonkPost → BlonkBlip)
- Class names (PostManager → BlipManager)
- Function names and variables
- Comments and console output
Terminology Refinement#
Why the changes:
- "Fluffs" better captures the lightweight, fun nature of upvotes
- Keeping "comments" maintains clarity for users
- The terminology is now: Blips get Fluffs and Comments
Renaming Complete ✅#
Successfully renamed all terminology:
- Posts → Blips
- Votes → Fluffs (updated from Vibes)
- Comments → Comments (reverted from Echoes)
- PostManager → BlipManager
- "Reddit clone" → "Vibe Radar"
The app now has its own unique personality!
Session 2: Web Interface with del.icio.us Aesthetic#
Why This Step#
- User wanted a web interface inspired by del.icio.us
- del.icio.us was perfect inspiration: minimalist, content-focused, tag-based
- Fits the "vibe radar" concept with simple signal transmission
Implementation Details#
- Express server with EJS templating
- Minimalist CSS mimicking del.icio.us style:
- Signature blue (#3366cc) accent color
- Verdana 11px font for that classic 2000s web feel
- Clean list-based layout
- Tag system for categorization
- Routes:
/- Recent blips list/submit- Transmit new blips/tag/:tag- Filter by tag
- Added tags to BlonkBlip schema
- "Transmit" instead of "Submit" for radar theme
Session 3: Migration to React + Vite#
Why This Step#
- User requested React ("let's just drop in react, we will need it later anyways")
- Better scalability and developer experience than server-side templates
- Modern tooling with Vite, React Query for server state
Implementation Details#
- Vite: Lightning-fast dev server, modern build tool
- React Query: Handles caching, loading states, background refetching
- React Router: Client-side routing for SPA experience
- TypeScript: Full type safety across the stack
- Split architecture:
- API server on port 3001 (Express + AT Protocol)
- React dev server on port 5173 (Vite)
- Proxy configuration for seamless API calls
Session 4: Multi-User Aggregation#
Why This Step#
- User wanted to see everyone's blips, not just their own
- AT Protocol is decentralized - data lives in individual repos
- Need an aggregator to collect blips from multiple users
Implementation Details#
- SQLite Database: Local storage for aggregated blips
- Polling System: Periodically fetches blips from known users
- User Tracking: Start with self, can add more users via API
- Firehose Ready: Structure supports real firehose integration later
How It Works#
- BlipAggregator polls known users every 30 seconds
- Fetches their blips via AT Protocol API
- Stores in SQLite with author info
- API serves aggregated data instead of single-user data
Session 5: Vibes - Mood-Based Communities#
Why This Step#
- User wanted "vibes" - groups based on feelings, not topics
- Examples: "Sunset Sunglasses Struts", "doinkin right", "dork nerd linkage"
- Revolutionary concept: organize by mood/energy, not subject matter
Implementation Details#
- Vibe Schema: Name, mood description, emoji, color
- Blips belong to Vibes: Each blip can be posted to a vibe
- Membership System: Users join vibes they resonate with
- Discovery by feeling: Browse vibes by their energy, not topic
How Vibes Work#
- Create a vibe with a name and mood
- Join vibes that match your energy
- Post blips to specific vibes
- Feed filtered by vibe shows only that mood
Why This Is Special#
- Reddit/forums organize by topic (r/programming, r/gaming)
- Vibes organize by feeling/energy/aesthetic
- Same topic can exist in different vibes with different energies
- "Sunset Sunglasses Struts" could have tech posts, but chill/confident
- "dork nerd linkage" could have the same tech posts, but excited/nerdy
Session 6: Viral Vibe Creation#
Why This Step#
- User: "we dont want duplicate vibes to be able to be created. we dont want to allow people to create vibes quite yet"
- Solution: Vibes created virally through hashtags
- When #vibe-YOUR_VIBE reaches threshold, it materializes
Implementation Details#
- Vibe Monitoring: Scans all posts for #vibe-* hashtags
- Snake_case requirement: Vibes must be snake_case format (e.g. sunset_vibes, not "sunset vibes")
- Mention Tracking: Database tracks who mentioned each vibe and when
- Threshold System: Originally 5 unique users needed
- Automatic Creation: When threshold hit, vibe is created automatically
Database Schema#
CREATE TABLE vibe_mentions (
vibe_name TEXT NOT NULL,
mentioned_by_did TEXT NOT NULL,
mentioned_at TEXT NOT NULL,
post_uri TEXT,
PRIMARY KEY (vibe_name, mentioned_by_did, mentioned_at)
);
How It Works#
- User posts with #vibe-something_new
- System extracts and validates vibe name
- Tracks mention in database
- Checks if threshold reached
- Auto-creates vibe with generated mood description
Session 7: Emerging Vibes Page#
Why This Step#
- User: "do we have a page to observer vibes we have seen come across the wire?"
- Need visibility into vibes before they materialize
- Shows progress toward creation threshold
Implementation Details#
- Emerging Vibes API:
/api/vibes/emergingendpoint - Progress Tracking: Shows mention count and progress bar
- Time Tracking: First and last mention timestamps
- React Page: Clean UI showing vibes gaining momentum
UI Features#
- Progress bars showing % to threshold
- Mention counts (X/5 mentions)
- Time since first/last mention
- Sorted by popularity and recency
Session 8: Firehose Implementation Attempts#
The Challenge#
- User: "Are you sure you are monitoring the bluesky firehose for these hashtags"
- User posted #vibe-test_post on actual Bluesky, not detected
- Realization: Only monitoring local blips, not Bluesky firehose
Multiple Attempts#
- SimpleFirehose - Direct WebSocket connection, got 502 errors
- TypedFirehose - Proper types but wrong frame decoding
- ATProtoFirehose - Used @atproto/sync but required auth
- FixedFirehose - Manual frame decoding attempt
- Skyware - Third-party library (ESM issues)
The Problem#
- AT Protocol firehose uses frame-based CBOR encoding
- Messages contain CAR files that need special parsing
- Complex binary format, not simple JSON
Frame Structure Discovered#
[frame header][CBOR message containing CAR file]
- Frame header is varint-encoded length
- Message contains blocks field with CAR file
- CAR file contains the actual record data
Current Solution#
- Fell back to Search API polling every 2 minutes
- Searches for "vibe-" (without #) to catch more posts
- Works but has delay, not real-time
Session 9: Dual Threshold System#
Why This Step#
- User: "make it so that if a vibe gets 10 total mentions (not unique) it will get created as well"
- Allows popular vibes to emerge even with fewer unique users
- More ways for vibes to go viral
Implementation Details#
const UNIQUE_MENTION_THRESHOLD = 5; // 5 different users
const TOTAL_MENTION_THRESHOLD = 10; // OR 10 total mentions
Database Changes#
- Added
getTotalMentionCount()method - Updated emerging vibes to show both counts
- Progress bar shows whichever threshold is closer
Results#
- "whatever_your_vibe_is" - 1 unique, 26 total → Created!
- "with_bobdawg" - 2 unique, 77 total → Created!
- Both vibes materialized via total mention threshold
Session 10: Grooves Instead of Fluffs#
The Change#
- Database schema changed from "fluffs" to "grooves"
- Added grooves table for tracking who grooved what
- Two groove types: "looks_good" and "shit_rips"
Note#
This change happened automatically (likely via linter or user edit) but represents evolution of the terminology.
Current Status Summary#
What's Working#
- Viral Vibe Creation: Vibes materialize when they hit 5 unique users OR 10 total mentions
- Search-Based Monitoring: Polls Bluesky search API every 2 minutes for "vibe-" mentions
- Emerging Vibes Page: Shows vibes gaining momentum with progress bars
- Multi-User Aggregation: Collects blips from known users via AT Protocol
- Mood-Based Communities: Revolutionary vibe concept fully implemented
- Dual Server Setup:
npm run devruns both API (3001) and React (5173)
Known Issues#
- Firehose: Not working due to complex CAR file parsing requirements
- Real-time: 2-minute delay for vibe detection due to search polling
- URL Encoding: Vibe URIs with special characters need proper encoding in API calls
- Compiled JS Files: Keep appearing alongside TypeScript files
Key Learnings#
- AT Protocol Complexity: Firehose is not simple JSON - requires CAR file parsing
- Viral Mechanics Work: The hashtag-based vibe creation is intuitive and fun
- Mood > Topic: Users understand and embrace the vibe concept immediately
- Search API Limitations: Works but not real-time, good enough for MVP
User Feedback Highlights#
- "lets just drop in react, we will need it later anyways" → Successful migration
- "we dont need a complex query client" → React Query was worth it
- "its failing to detect emerging vibes and we have no server logs" → Fixed with better logging
- "why did you change it from 5 to 3??" → Restored original threshold
- "stop using curl man" → Created Python script for debugging
- "you are deleting your prior work in the implementation notes!!!! what the hell man" → Restored this file
Technical Debt#
- Multiple unused firehose implementations in codebase
- Compiled JS files keep appearing (TypeScript build artifacts)
- Need better error handling for vibe URI encoding
- Should document the CAR file parsing challenge for future attempts
Next Potential Features#
- Vibe merging for similar vibes
- Vibe seasons/phases (morning vs night versions)
- Cross-vibe posting for compatible moods
- Vibe discovery algorithm based on groove patterns
- Federation between Blonk instances
- Proper firehose implementation with CAR parsing
- Real groove functionality (looks_good vs shit_rips)
- Vibe member directory
- Vibe mood matching algorithm
- Export vibes to other platforms