WriteDaily Development Update: Framework Migration Progress and the Pace of Side Projects
Back in April, I wrote about the framework migration underway for WriteDaily — moving from raw PHP to Laravel while keeping the existing product running. The live site has continued to serve writers throughout, crossing 70,000 total sessions during the migration. Eight months in, here’s where things stand.
What’s Complete
The core architecture is solid. The Eloquent models for every domain object — Entry, User, Pace, Stats, Badge, Condition, Advice, Notification, LiwcDefinition, LiwcCategory — are mapped and tested against their database migrations. The writing loop (compose, auto-save, word count, pace tracking) works identically to the production version.
The LIWC parser is now a standalone Composer library under the Ringalpha\Writedaily namespace. It loads the LIWC2007 dictionary, tokenises text, and produces a structured sentiment array. Cached sentiment data serialises into the entry record on save, eliminating the per-request analysis cost from the old architecture.
Sentry authentication handles registration, login, and password reset. Multi-user support — one of the primary motivations for the migration — is in place.
What’s In Progress
Gamification Engine
The badge and condition system is partially complete. The data model is fully defined: 40+ conditions in the gamification.json configuration, badge tiering with group positions, advice triggers for contextual tips. The processCalculation() method on the Condition model handles SQL queries, configuration checks, and operator evaluation.
What remains: the cron job that triggers evaluations on a schedule. The engine can evaluate conditions on demand, but the automated hourly evaluation loop isn’t wired up yet. Badge awarding — actually attaching badges to user accounts when conditions are met — is implemented but awaiting integration testing.
Notification System
The Notification model exists, but the trigger layer that fires notifications on events (badge earned, streak milestone, weekly summary) isn’t complete. This is a wiring problem, not an architecture problem — the events fire, the listeners just need to be connected.
Test Coverage
phpunit.xml is configured with Laravel’s testing framework. The test directory has the scaffolding. Writing the actual test cases is the next priority — the production switch happens once the core writing loop and sentiment analysis pipeline have full coverage.
The Pace of Side Projects
The migration has taken a realistic pace, for reasons familiar to anyone maintaining a side project alongside client work:
Client deadlines take priority. WriteDaily is a labour of love alongside paying client projects. When a client needs attention, the migration waits. Over eight months, that pattern has meant roughly 2–3 productive days per month on the project — steady progress at a sustainable cadence.
The existing product works well. There’s no crisis driving urgency. The raw PHP codebase has earned some technical debt, but it’s stable. Users are writing daily without issues. The migration is architectural investment, not emergency repair — and investment projects reward patience.
Thoughtful scope yields better design. The gamification system started as a simple badge counter. It evolved into a declarative rules engine because the architecture benefited from extra design time between client projects. The result is a more flexible system than the initial spec would have produced.
Sequencing and Priorities
I’m prioritising quality over deadlines. Every previous WriteDaily timeline has shifted when client work intervened, so I’m not setting a public launch date this time. The migration switches to production when testing is complete — not before.
The gamification system ships after the migration is stable. The badge engine is the most complex new feature in the stack, and it needs to be trustworthy before users interact with it. Shipping gamification that triggers incorrectly would erode trust, so sequencing matters: stability first, gamification second.
What Comes Next
The priorities for early 2020:
- Complete the cron evaluation loop — the final piece of the gamification pipeline
- Write test coverage — at minimum, integration tests on the entry save pipeline and LIWC analysis
- Wire notifications — badge awards and streak milestones
- Switch production traffic — once tested, migrate users to the Laravel stack
The old codebase continues to serve users in the meantime. The migration runs in parallel, and when it’s ready, the switch will happen without user impact.
If you’re curious about the architecture — or if you, too, have a side project that’s been running for years on incremental progress — writedaily.co is still live. The Laravel code will be open-sourced when the migration is complete.