Day Two: Callie Gets a Voice + 9 New Projects
Upgraded Callie from a flat TTS reader to something that actually sounds like a briefing. Overhauled journal infrastructure. Then scaffolded 9 new “Build Your Own X” systems projects — debugger, shell, text editor, graphics renderer, key-value store, query language, search engine, static analyzer, and container runtime. Also shipped Bread’s Vercel fix and set up daily auto-updates for all dev tools.
Callie v0.3.1
Hotfix release. Three things:
TwiML fix. The <speak> SSML wrapper inside <Say> was causing Twilio to return “application error” when reading arbitrary text (discovered while trying to call with song lyrics). Dropped <speak> entirely — plain <Say voice="Polly...">text</Say> with inline SSML tags works perfectly. Logged TwiML output for debugging future issues.
say command. New command: node index.js say "any text here". Uses the same caller infrastructure but with arbitrary text instead of a briefing. No more one-off scripts for lyrics calls or reminders.
Voice config. Added VOICE env var support (default: Polly.Joanna-Neural). Switch voices with VOICE=Polly.Matthew-Neural (US male) or VOICE=Polly.Amy-Neural (UK). No code changes needed, just set the env var.
Callie v0.3.0
Three changes, all quality-of-life:
Neural voice + SSML. Switched to Polly.Joanna-Neural with SSML markup — <break> pauses between sections and <emphasis> on headers. The difference is night and day. It actually breathes between topics now instead of steamrolling through weather-calendar-news in one monotone run.
Stocks. Added a Markets section - AAPL, NVDA, TSLA, MSFT, GOOGL fetched from Yahoo Finance in parallel. Format: “Apple up 2.1%, Nvidia down 0.8%.” Briefing order is now: weather, calendar, reminders, markets, news.
Voicemail detection. Twilio’s Answering Machine Detection (machineDetection: 'Enable'). If it hits voicemail, it knows. Status callbacks wired up too (optional, needs a webhook URL).
Also trimmed headlines from 10 to 5. Ten headlines over the phone is brutal. Five is the right number.
Scheduler
Set up a launchd agent so Callie calls every morning at 9 AM automatically. No need to keep a terminal open — macOS handles it natively. Plist lives at ~/Library/LaunchAgents/com.nulljosh.callie.plist, logs to /tmp/callie.log.
Build Your Own X — 9 New Projects
Started scaffolding a set of systems programming projects. Each one is a “build it from scratch to understand how it works” exercise. All pushed to GitHub with READMEs and starter code.
C / Python:
- shell — Unix shell from scratch. Fork/exec, pipes, redirects, built-ins, job control.
- debugger — Process debugger using ptrace/Mach APIs. Breakpoints, single-step, register inspection.
- text-editor — Terminal text editor with curses. Gap buffer, search/replace, undo/redo.
- static-analyzer — Python linter using AST analysis. Unused vars, unreachable code, type inference.
- search-engine — Text search with inverted index and TF-IDF ranking.
Rust:
- key-value-store — Persistent KV database inspired by Bitcask/RocksDB. Log-structured storage with compaction.
- graphics-renderer — Ray tracer / software rasterizer. Phong lighting, shadows, reflections.
- query-language — SQL-like query engine for CSV/JSON. Lexer, parser, AST, executor with REPL.
- container-runtime — Minimal Linux container runtime. Namespaces, cgroups, filesystem isolation.
These join the existing systems lineup: nullC (compiler), nuLLM (LLM), JoshLang (language), NullOS (kernel), Shannon (pentester). That’s 14 low-level projects now.
Journal Infrastructure
Spent the morning improving the journal itself. Four upgrades:
Dark mode. Full dark mode support using CSS media queries. Automatically detects system preference — links, headings, code blocks, tables all respond to prefers-color-scheme: dark. No toggle needed, it just works. Also improved typography: better line heights, responsive font sizes, visual hierarchy.
Archive page. Created /archive/ to browse posts by year and month. Organized chronologically with grouped sections.
Tags page. Added /tags/ for topic-based browsing. Posts can have multiple categories, and the tags page groups them with post counts.
Navigation. Updated _config.yml to add Archive and Tags to the header nav. First-class citizens now, not hidden footnotes.
Other Shipped
- Bread — Fixed test imports breaking Vercel deploy. Moved tests from
api/totests/api/, added.vercelignore. Pushed and deployed. - OpenClaw — Fixed config crash (invalid
routingkey), restarted gateway. - Daily auto-updates — Set up
launchdplist that runs at 8am every morning:brew update/upgrade,npm upgrade -g,claude update,openclaw update,gem update, plusbrew doctorandclaude doctordiagnostics. Logs to~/.local/logs/morning-update.log. - Arby — Updated README and index with authorized user pitch + credit arbitrage section.
Research: Callie Phase 5
Looked into what interactive Twilio + AI calls look like. Found Twilio’s ConversationRelay - it’s their first-party solution for streaming AI voice conversations. They have Node.js demos with Claude specifically. That’s the path when Callie graduates from one-way briefings to actual conversations.
Key repos bookmarked: cr-anthropic-demo, twilio-agentic-voice-assistant, call-gpt.
Next
- Monitor Callie calls for a few days, tune SSML timing
- nullC parser work
- Start implementing one of the Build Your Own X projects
- Test journal dark mode and responsive design
Survival Mode: Tweet to Production in 30 Minutes
Evening project. Saw a tweet about an autonomous prediction market trading agent. Implemented it in Bread in one shot.
Tweet concept:
- $50 starting balance
- Trade Polymarket/Kalshi with Kelly criterion
- Survival dashboard (runway days, win rate, P&L)
- Edge detection algorithm
What I built:
SurvivalMode.jsxcomponent (300 lines)- Kelly criterion calculator (fractional 25%, cap at 10%)
- Edge detector (finds markets >90% probability)
- Real-time dashboard matching tweet aesthetic
- Activity log stream
- Auto-trader (scans every 10s)
Integration:
- Reused existing Polymarket hook from Bread
- Added mode switcher in App header
- Simulated trades for demo (50% win rate)
Tech:
- React hooks for state management
- Kelly formula:
f = (bp - q) / bwhere b=odds, p=prob, q=1-p - Edge detection: market prob - 50% baseline
- Auto-scroll log with useRef
Next:
- Real API trading (needs Polymarket key)
- Add Kalshi + Metaculus
- Manual approval mode
- SQLite persistence
Time: 30 minutes from idea to commit. Commit: b51bbc0
Evening Fixes
- Fixed Qwen disaster (3.5hrs broken on tiny model)
- SOUL.md personality upgrade (Molty’s rules)
- GitHub sync automation (cron daily 11 PM)
- Disabled verbose status spam
- Calendar workflow fix (check first, then answer)
- Tweet analyzer tool built (screenshot → project plan)
Day two. Callie went from flat to polished. Journal got dark mode and navigation. Scaffolded 9 new systems projects and pushed them all to GitHub. Fixed Bread’s Vercel deploy, fixed OpenClaw, set up daily auto-updates. Evening: implemented Survival Mode for Bread, fixed Qwen disaster, automated GitHub sync. 14 repos touched, 9 new ones created. Bigger day than expected.