Loading...
Loading...
Personal publishing platform with a voice-to-text PWA, a hidden alternate dimension (the Void), and interactive experiments baked into individual posts. Built on Next.js 15, Payload CMS 3, and PostgreSQL.
Bleat.Space is a personal publishing platform I built from scratch as a space to write freely and experiment with ideas that don't fit a professional portfolio.
The architecture is one codebase serving two completely different experiences. The main site is a clean, minimal publishing platform — thoughts, long-form posts, and a music section. But hidden in the footer is an empty set symbol (∅) that takes you to the Void — an alternate version of the entire site with a dark theme, glitch animations, scanline overlays, corrupted text, and its own content stream. Same database, same Payload CMS collections, but content is gated by a single isWeird flag. Regular queries filter for isWeird: false, Void queries filter for isWeird: true. The navigation renames everything — Thoughts become Fragments, Posts become Transmissions, Sounds become Noise.
The most technically interesting piece is the voice posting app. It lives at speak.bleat.space (subdomain rewriting handled by Next.js middleware) and is a progressive web app — no app store, works straight from the phone browser. It uses the Web Speech API for real-time voice recognition, with automatic text formatting (title case for titles, sentence case for content). You can post directly or schedule for later using natural language — say "tomorrow at 9 AM" or "next Tuesday" and chrono-node parses it into a scheduled publish date. The app handles device registration with a PIN system, stores device tokens in the database, and gives haptic and visual feedback during recording. You can toggle between posting to the regular site or the Void.
The platform is also a playground for one-off interactive experiments embedded directly into posts. One example is the Splinter Index — a 15-question interactive quiz about consumerism that scores you across four dimensions and assigns you a philosophical archetype. Another is a community feature where people submit songs that reference themselves (meta-songs) with optional OpenAI validation. These aren't core features of the platform — they're experiments I build whenever I have time between paid work. The goal is for every few posts to include something interactive or AI-powered that makes each piece its own experience rather than just text on a page.
The music section includes a full audio player with cover art, lyrics, and playback controls. Subscribers can set granular preferences — daily thoughts, weekly digests, blog posts, void transmissions — each managed independently through MailerLite integration.
Wanted a personal publishing space that goes beyond a standard blog — somewhere to write without professional constraints, experiment with interactive features in individual posts, and push the boundaries of what a "blog post" can be. Standard CMS platforms don't support voice posting, dual-themed content streams, or embedding custom interactive experiences into individual posts.
Built a full-stack publishing platform on Next.js 15 and Payload CMS 3 with a dual-theme architecture (regular + Void) powered by a single content flag. Added a PWA voice posting app at a subdomain with natural language scheduling. Designed the content model to support embedding interactive experiments — quizzes, community features, AI-powered tools — directly into posts as custom blocks.
Platform live and actively used for publishing. Voice app enables posting thoughts in under 30 seconds from phone to published. Dual-theme architecture serves two distinct content experiences from one codebase with zero duplication. Interactive experiments ship as individual post features without touching the core platform.
Check out some of my other work