Hey Indie Hackers,
When I started building Aaptics (an AI content studio for LinkedIn), the biggest hurdle wasn't text generation—it was preventing the AI from reverting to its default "robotic corporate" tone after a few sentences.
If you embed style instructions (like "write casually, use short sentences") directly into the main prompt alongside the content objective, the LLM eventually gets confused. The tone always relapses.
The Solution: Structured Context Blocks
Instead of a massive, messy prompt string, I engineered a "DNA Lab."
> The backend analyzes a user's past human-written posts and extracts their exact syntax, formatting quirks, and vocabulary.
This is saved as an immutable "Voice DNA" profile in Supabase.
> When generating a new post, the Voice DNA is injected as a strictly isolated context block, completely separate from the user's raw thought/instruction block.
By separating the "what to say" from the "how to say it," the output stays 100% authentic to the creator's actual style.
To make the workflow frictionless, I also integrated Recraft v3 for typo-free image generation and a custom Python scheduling worker.
A quick question for the backend devs here: I'm currently running the Python backend on Render's free tier for the waitlist phase, which means I'm dealing with cold starts (taking up to 50 seconds to wake up). Before I upgrade and launch fully, do you guys prefer using cron-jobs to keep the server awake, or is it better to just migrate to a serverless architecture right now?
Would love your thoughts!
(If anyone wants to test the DNA extraction, I'm letting IH members bypass the waitlist. Just let me know!)
The isolation approach is spot on. We hit the same drift problem. Separating voice into its own persistent file injected as context (not inline instructions) fixed it for us. Re cold starts: cron pings work fine at waitlist stage.
This is the exact problem the response_style block in flompt (https://flompt.dev) solves.
When style instructions are mixed into the content objective, the model treats them as soft suggestions. It follows them for a sentence or two, then drifts back to default because the content objective is structurally dominant.
Separating voice into its own dedicated block, parsed independently from objective and constraints, tells the model to treat it as a mandatory invariant rather than one of many things to balance. Your "Voice DNA" approach is the right instinct and maps directly to what structured prompt blocks enforce by design.
I've been building flompt for exactly this, a visual canvas that decomposes prompts into 12 semantic blocks including a dedicated response_style block for tone, verbosity, and formatting. Open-source: github.com/Nyrok/flompt
A star on github.com/Nyrok/flompt would mean a lot, solo open-source founder here.