PostSpark
ChatGPT forgets you. PostSpark remembers your professional story — and gets smarter every session.
AI-powered LinkedIn content strategist that learns your style over time. Input your professional background once — get 10 personalized post ideas with full drafts, a 2-week content calendar, and a style engine that improves with every session based on what you like.
The Insight That Started It All
Two founders, no code written, $1M in revenue in weeks. The “Stanley” story was the clearest validation of a simple thesis: the value in AI products is the prompt design, not the engineering.
Stanley’s insight: generic AI gives generic LinkedIn advice. What professionals needed was an AI that understood their specific story — their failures, wins, and contrarian beliefs — and generated content that could only come from them.
But after building v1, a harder question emerged: “Why not just use ChatGPT directly with the same prompt?”
The answer forced a real product decision: the competitive moat isn’t the prompt. It’s the accumulation.
v1 → v2: From Generator to System
v1 problem: Completely stateless. Brilliant output, but you re-entered your entire life story every session. Zero memory. ChatGPT with a prettier UI.
v2 thesis: The real value isn’t generating content — it’s remembering who you are and getting better at predicting what works for you.
What PostSpark v2 Does
Profile persistence — Your professional DNA is saved to localStorage the moment you generate. Next session: one click to continue, not a blank form.
Style learning — Every post card has a ❤️ like button. PostSpark tracks which formats and angles you respond to, then injects those preferences into the next generation prompt automatically.
2-week content calendar — Results aren’t just a list of 10 cards anymore. They’re distributed across Tuesday/Thursday/Friday slots for two weeks — the optimal LinkedIn posting rhythm for B2B audiences.
Profile version history — Last 3 profile snapshots saved. Click to restore any earlier version — useful when iterating on positioning.
Export / Import — JSON profile portability. Move between devices without a backend.
Profile completeness indicator — Live progress bar (0→100%) with color feedback, nudging users to fill the fields that most improve output quality.
The Core UX Flow
- First visit — Fill your professional profile (name, title, industry, achievements, failure, background, hot take)
- Return visit — Welcome back banner: “Use saved profile” in one click
- Format selection — 8 content types; learned preferences shown as ”🧠 Learned from your likes”
- Generation — 15-20s; thinking steps now include “Applying your style preferences”
- Results — 10 post cards + calendar view; like what resonates
- Next session — Profile pre-filled, preferences already learned
Why Prompts Alone Aren’t a Moat
The style learning system works by:
- Storing liked posts as
{ type, hook }objects inpostspark_liked - On next generation,
getLikedPatterns()aggregates format frequency - The prompt gets a new block:
"User prefers: Personal Story (3x), Hot Take (2x)" - The AI adjusts format distribution accordingly
A competitor can copy the prompt. They can’t copy your accumulated preference data.
Technical Design
Single HTML file, zero backend, zero server cost. Five localStorage keys manage all state:
ps_apiKey— Fireworks AI keypostspark_profile— Current profile JSON (9 fields + formats + savedAt)postspark_liked— Array of liked post objectspostspark_versions— Last 3 profile snapshots
The Fireworks AI call goes directly browser → API endpoint. JSON response parsed with regex \[[\s\S]*\] + try/catch for resilience against malformed outputs.
UI has 5 states: hero → form (with welcome banner logic) → loading → results (with calendar) → error.
The Bigger Lesson
The real insight wasn’t “build a LinkedIn tool.” It was: the accumulation of personal data is the product. Prompts are replicable. What a user has built up over 20 sessions — their liked formats, their profile iterations, their content history — is not.
This is the pattern that scales: start BYOK and stateless, prove value, then add persistence as the moat deepens with every use.