Changelog
Here we document everything we ship — new features, improvements, and fixes. No release notes nobody reads.
The content planner stops repeating topic labels: every suggested time slot now comes with a concrete idea (topic + angle + exactly what to post, referencing your real tools and products by name), it tells you how many posts per week make sense for your account, and it's honest when there isn't enough schedule data yet. The Stories composer becomes a real editor: GIPHY sticker search (the same catalog Instagram's native editor uses), animated stickers, text that resizes with real reflow, video audio in the preview, and full direct manipulation — drop files in, drag stickers where you want them, toss anything into the trash.
Content plan with concrete ideas: every suggested slot carries a topic + editorial angle (tip, tool showcase, product mention, before→after) and a specific, ready-to-execute idea — it can reference your real products and tools configured in the brand profile by name
Suggested cadence: the plan calculates how many posts per week fit your account based on your content pillars, audience, and goal — with the calculation breakdown visible, not a black box
Data honesty: when there's no varied-schedule history yet, the plan says so clearly and includes deliberate exploration slots to start generating that signal — it no longer fakes "informed" recommendations
Real schedule exploration: ~1 in 3 "next slot" recommendations deliberately tries a new time (you'll see the "Exploration time slot" chip on the dashboard) — that's how the system learns when your audience actually responds
Stories: GIPHY sticker search inside the composer — the same catalog Instagram's native editor uses, with family-safe content filtering, caching for instant responses, and official attribution
Stories: 14 new static stickers (26 total) and 10 animated ones. An animated sticker on a photo publishes the story as a short looping video — the only way Meta allows it to animate
Stories: resizable text — tap the text and drag the purple dot to narrow or widen the block; the text truly reflows (more or fewer lines) and what you see in the preview is exactly what gets published
Stories: video audio can now be heard in the preview via a speaker button — it hides automatically when the file has no audio track
Stories: full direct manipulation — drop a photo or video onto the composer to upload it, drag stickers from the panel to the exact position you want, and drag any element onto the trash bin to remove it from the scene
Klee gains the "fun fact" register (surprising fact, short, with discovery hashtags) and the copy score now grades each format against its own rubric — a short community post is no longer penalized for not looking like a sales post
Create Post modal: icon-only platform toggles and stacked layout on mobile — no more truncated text on small screens
English is now the default language for any new visitor (existing users keep their saved preference). And it's no longer just the dashboard: every public page — home, features, pricing, roadmap, the "Who it's for" landing pages, the free tools hub with its 8 generators, and the legal pages — now has an English version with the same instant toggle used across the rest of the app, available in the nav bar on any public page.
Language selector now available in the nav bar on every public page (previously it only existed inside the dashboard and on login)
Home, Features, Pricing, Roadmap, and all 4 "Who it's for" landing pages fully translated into English
Free tools hub and its 8 generators (hashtags, bio, copy, carousel, Stories scripts, engagement calculator, UTM generator) translated, including the AI-generated messages
Legal pages (cookies, privacy, terms, data deletion) now available in English
English becomes the default language for new accounts — already-registered users are unaffected and keep whatever language they had saved
The whole app now has an English version, switchable with a toggle with no page reload: login, the full dashboard, and the Klee assistant. Klee now detects your chosen language and replies (and generates copy) in that language, without breaking the internal format it uses to build variants. Several pieces of content that used to always come back in Spanish straight from the server — the dashboard's attention block, suggested posting times, Analytics' AI analysis — now respect your language too. And along the way: Growth, which had spent weeks showing its fixed recommendations in English regardless of the user's language, now has a Spanish version.
Language selector (ES/EN) available across the whole app — saved to your account and persists across sessions and devices
Klee (dashboard panel and public widget) detects your chosen language and replies — and generates all post copy — in that language
Metrics glossary: all 33 terms (with their calculation formulas) are now available in English
Growth: recommendations, growth strategies, and predictions are now also available in Spanish — previously they only existed in English regardless of your account's language
The dashboard's attention block, the content planner's suggested posting times, and Analytics' AI analysis are now generated in your account's language instead of always coming back in Spanish
Stories error messages and notices (e.g. the notice that Instagram doesn't allow deleting content via the API) now respect your language
The unified inbox gains two big capabilities: you can now comment, edit, and delete your own comments on FB and IG directly from Klaapy, and Messenger and Instagram Direct conversations land in the same place as comments — with Klee suggestions included. We also fixed an important root cause: app-level webhook registration with Meta had never actually been activated, so the inbox relied entirely on 5-minute polling and never received messages in real time. Alongside this, an extensive round of data-accuracy fixes: Meta metrics that stayed frozen all day, wrong attribution for the post that brought in the most followers, imported posts left uncategorized on the content map, and Facebook Stories with no metrics of their own.
Your own comments on Facebook and Instagram — create, and on Facebook also edit and like/unlike, directly from the post detail view or the inbox
Messenger and Instagram Direct integrated into the same unified inbox as comments — replies within the 24h window, Klee suggestions, read/unread indicator, and platform filter
Import of historical Messenger/Instagram Direct conversations from before this update (previously only new messages came in)
Real profile photos on messages and comments — replaces the generic initial icon and "User XXXXX" placeholder
Settings: new "Meta Webhooks" section (per-page status, re-subscribe button) and direct page connection from your Meta Business Portfolio
Data-freshness chip ("Meta data · Xm ago") with a manual refresh button on Dashboard, Analytics, Stories, and the post detail view in Audience
Deleting a Story now permanently removes it from Klaapy (previously it stayed archived as "Deleted" forever); you can also edit/delete scheduled or draft Stories, and publish them ahead of schedule with a "Publish now" button
Facebook Stories now show their own views, reach, and reactions — previously Analytics' Stories block only pulled Instagram data
Instagram Direct stickers and automated replies now render correctly in the inbox instead of showing up as empty bubbles
"Publishing…" indicator while Meta confirms a reply that was just sent — previously the edit/delete options took a while to appear with no feedback at all
Stories page: platform filter, year/month navigation in the history view, and a 2-column grid
Mobile-responsiveness audit: the inbox reply field and the footers of several modals (create post, Stories, Klee panel) no longer sit out of view on small screens with the browser bar visible
Manual metrics sync did nothing if the automatic daily cycle had already run — it now correctly pulls the latest numbers from Meta
Instagram feed post views weren't being recorded — that metric was never requested from the API
Audience's "post that brought in the most followers" was calculated with the wrong date window and could point to a post published hours after the fact, when it no longer applied
Posts imported from Meta (not created in Klaapy) weren't categorized on the content/topics map — they were invisible to that analysis
The Dashboard's and Analytics' "best post" for Facebook showed the most recent one instead of the best-performing one, because Facebook's engagement rate always computes to 0 — now falls back to absolute engagement as the criterion
The content planner's number-of-slots selector (3/5/7) didn't regenerate the plan when changed
Replies to Instagram comments were saved in Klaapy but never actually published to Instagram
Post thumbnails in inbox comments showed a generic icon — Meta's image URLs expire, and they now refresh automatically
Klaapy launches four audience landing pages (creators, agencies, entrepreneurs, freelancers) with advanced SEO and FAQ schemas for AI citations. robots.ts was reconfigured to allow indexing by GPTBot, Claude, and Gemini. The sitemap now includes every tools and audience page. The free tools swap emojis for professional icons. An AI-error notice was added to Klee and to every tool.
Four new "Who it's for" landing pages — /para-creadores, /para-agencias, /para-emprendedores, and /para-freelancers — with pain points, features, an FAQ, and JSON-LD schema for featured snippets and AI citations
Navigation: "Who it's for" dropdown on desktop (2-column grid) and a collapsible section on mobile — the mobile menu is now scrollable for content that exceeds the viewport
Footer: reorganized columns — Tools (8 links) and Who it's for (4 links) added in the order: Tools · Who it's for · Product · Legal
AI notice: "AI can make mistakes. Verify important information." permanently added to Klee (public widget and dashboard panel) and below the Generate button on every free tool
GEO (Generative Engine Optimization): robots.ts reconfigured to explicitly allow GPTBot, OAI-SearchBot, anthropic-ai, ClaudeBot, Google-Extended, and PerplexityBot — they were previously blocked, which kept ChatGPT, Gemini, and Perplexity from indexing and recommending Klaapy
Sitemap: now includes the 8 tools pages (priority 0.7), the 4 audience pages (priority 0.8), and the /herramientas hub (priority 0.9) — 23 URLs total
Free tools: emojis replaced with lucide-react icons — Hash, TrendingUp, Link2, UserRound, PenLine, LayoutGrid, Video — with per-tool accent colors
Audience pages: cards now share the same pastel style (rounded-3xl, #FFF7ED / #F5F3FF / #ECFEFF / #FFF1F2 backgrounds) and Framer Motion fade-up animations as the landing and features pages
Emojis in AI tool prompts: bio-ig, copy-ig, carrusel, and stories now include format-specific emoji guidance for more natural results with visual personality
Klee launches two new capabilities: short fact-style posts with a CTA, and reading a product's features to vary content angles without repeating the same approach. The account selector in the editor was unified, and posts can now be synced individually from Meta. Also fixed: the dashboard's average CAFS, the time shown in notification emails, and timezone offsets in scheduling.
Klee: short posts — 5 fact-style one-liners with an actionable CTA and hashtags chosen from brand context. Only triggered by "short posts," "short phrases," or equivalent phrasing
Brand profiles: new "Product / brand features" field — list your key differentiators and benefits, comma-separated. Klee turns them into content angles (pain, aspiration, social proof) and rotates them across suggestions so each post takes a different approach
Posts: Sync button on every published card — re-fetches the post from the Meta Graph API and updates the image and copy instantly without a full re-import
Posts: unified account selector — replaces the two separate FB/IG dropdowns. If a platform isn't available on the account, the button greys out. The "Also post to X" toggle only appears when the account has both platforms
Posts: the publish-confirmation modal shows both platforms with overlapping icons and a "Publish to both" button when applicable
Klee: when a profile has features configured, variants map each feature to audience-relevant language — it never lists features literally, it translates them into perceived benefits
"Sync with Meta" now updates the copy and image of already-imported posts if they changed on Meta, in addition to pulling in new ones. The result reports how many were imported vs. updated
Klee: refreshed voice — rotating perspectives (you / we / they), a POST structure (Hook → Tension → Shift → Product → Close), a list of banned words and metaphors, neutral Latin American register (never Argentine)
Dashboard: the average CAFS card showed 0 due to two combined silent bugs — the query's 500-post cap and a non-existent sort field (executed_at). Fixed: now pulls every post for the tenant
Notification emails: date and time showed up in UTC. Now shown in the server's local timezone (America/Chicago)
Scheduling: posts were saved 1 hour off in some timezones — fixed by always sending UTC from the frontend and parsing with timezone awareness on the backend
Rescheduling and syncing now update the card immediately without needing a manual reload — the re-render bail-out now includes scheduled_at, thumbnail_url, and copy
Klee AI launches an indigo/violet palette and a third copy variant — Narrative — for brand storytelling. The post editor now imports OG metadata from URLs in real time and shows the article card in the Facebook preview. Closing the editor with unsaved changes now asks whether to discard or save as a draft.
Klee: "Narrative" variant — copy written as brand storytelling that opens from inside the brand's story, not from the product
Posts: real-time link preview — typing a URL into the copy imports its OG metadata (title, description, image) and shows the card in the Facebook preview
Posts: closing the editor with unsaved changes now shows a confirmation dialog with two options — Discard or Save draft
Klee: color palette refreshed from pink/purple to indigo/violet (#6366f1) — a more subdued identity applied to both the dashboard panel and the landing-page widget
Posts: line breaks in the copy are now respected in the Facebook and Instagram previews
Posts: the copy field auto-expands when opening the modal in edit mode
Facebook: when publishing text with a URL, `link` is now passed as an explicit parameter so Facebook attaches the article card automatically
Sync: posts scheduled directly from Facebook are now auto-imported into Klaapy every 4 hours via Celery Beat
Klee on mobile: pressing Enter now inserts a line break instead of sending the message (the correct behavior on touch devices)
Pro and Agency plans are now purchasable directly from the app. Settings → Billing was completely redesigned with real checkout, a monthly/annual toggle, and a management portal. Three critical bugs were fixed: CAFS Brief showing no suggestions for low scores, an incorrect timing hour, and Facebook pages not being recognized in the post modal.
Stripe billing in production — Pro and Agency subscriptions with real payment, a customer portal for managing payment methods and cancellations, and webhooks that sync the plan automatically
Settings → Billing revamped: monthly/annual toggle, checkout cards for Pro ($39 or $29 annual) and Agency ($109 or $82), a "Manage subscription" button giving active users access to the Stripe portal
Pricing page: Agency now has its own "Start Agency" CTA button — removed "Talk to sales"
Content Brief — a "Claude" (violet) or "Model" (slate) pill badge shows which system generated the brief's suggestions
Circuit breaker for the Claude API — if it returns an insufficient-credits error, it disables itself for 10 minutes to avoid cascading failed calls
Sparkles icon removed from the UI — replaced with Activity on the CAFS badge, Clock on the timing suggestion, and ArrowRight in the onboarding wizard
CAFS Brief showed no suggestions for low-scoring posts — contributors were being read from output instead of explanation; the heuristic now covers Facebook posts and always guarantees at least 1 suggestion
CAFS Preview showed the wrong hour in the timing suggestion — the backend was receiving the server's UTC hour instead of the user's local hour
The create/view post modal didn't recognize connected Facebook pages — getStatus() returns a nested {connections:[...]} structure while {pages:[...]} was expected; fixed by using getAccounts()
Klee AI stops depending on localStorage — conversations and messages are now persisted to the database per tenant. Plan-based quota enforcement is implemented (Starter: 15 queries/month, no images). Settings launches its Security and Billing sections.
Klee: conversations and messages saved to the database — history available across sessions and devices
Klee: history panel with a smooth cross-fade transition — the panel no longer resizes when opening history
Klee: plan-based quota enforcement — Starter: 15 queries/month (text only), Pro: unlimited + 3 images, Agency: unlimited + 5 images
Klee: monthly usage bar visible for Starter users — shows how many queries remain
Settings → Security: authentication method (Magic Link), a danger zone with a "Delete my account" button
Account: permanently delete your account — requires typing your email to confirm, wipes all tenant data if the user is the only member
Settings → Billing: shows the current plan with included features and an upgrade CTA for Starter users
Klee: custom SVG icons in the panel (history, reset, send, attach, close) — replaces emojis
Django Admin: Tenant management with an editable plan directly in the list, without opening each tenant individually
Django Admin: Klee conversation monitoring with inline messages and a per-tenant monthly usage log
The tenant dropdown in admin showed a UUID instead of the name — fixed with a __str__ on the model
The Klee panel shrank when opening history — fixed with a fixed height + absolute layers instead of maxHeight
An orphaned user message could be left in the DB if the Claude call failed — the saved message is now deleted before returning the error
The CAFS model was recalibrated from scratch. Drafts are now fully editable. Analytics stops duplicating the Dashboard and shows its own content analysis with an actionable Action Plan.
Posts: full Edit modal for drafts and scheduled posts — change image, copy, platform, format, and status without recreating the post
Posts: when editing, the existing image shows in the live preview immediately when the modal opens
Posts: CAFS Preview in edit mode no longer resets as you type — it only updates when you press "Update," so it doesn't interrupt your flow
Post view: split panel on desktop — CAFS breakdown on the left, actionable suggestions on the right. On mobile: Analysis / Suggestions / A/B Test tabs
Analytics: completely redesigned — performance by format, performance by time of day, copy-quality analysis (CTA, questions, emojis, length), and an FB vs. IG comparison
Analytics: Action Plan with expandable recommendations based on your real data — each one includes the problem with concrete numbers, why it matters, numbered steps, and the expected CAFS-point improvement
Settings: Notifications section now functional with 5 configurable alert types — successful publish, error, CAFS anomaly, pre-publish reminder, and weekly summary
CAFS v2.1: weights normalized to 1.00 — the theoretical max score is now 100 (it used to be 85 due to a calibration bug in how the weights summed)
CAFS: suggestions' expected_lift recalibrated using each factor's real weight — it no longer promises 30-point improvements when the model can give at most 4 points for a copy change
CAFS: saving an edited post now automatically recalculates its score — the post list reflects the updated value without a manual refresh
Dashboard: Average CAFS fixed — falls back to trendData when the endpoint returns 0
Content Brief: the endpoint was using the wrong database and a lowercase model name — the brief wasn't being generated for any post (a silent failure)
CAFSPreview hashtags: removed the fallback that extracted keywords from the copy — when Claude is unavailable, it now shows nothing instead of nonsensical hashtags
Created the missing PATCH /posts/{id} endpoint — it didn't exist before, so edits were never actually saved to the backend
The biggest update since launch. The calendar is now fully interactive and posts can be managed in bulk.
Calendar: drag any post (draft/scheduled/approved) to another day to reschedule it without opening the modal
Posts: multi-select with checkboxes — publish or delete several posts at once from the action bar
Posts: Duplicate button — creates a draft copy in one click, keeping the copy, channel, and format
Scheduling: AI-suggested optimal-time chips when selecting "Schedule" (Instagram: 6–9pm, Facebook: 12–2pm and 6–8pm)
Inbox: Sparkles button generates 3 AI-written contextual replies — pick the one that sounds best
Settings: Profile and Team section now functional — member list, roles, and email invitations
Analytics: CSV export (previously JSON) with date, score, and distribution by range
Growth Intelligence now uses the tenant's real Meta token instead of a placeholder
New visual system built on the #0f0a1e gradient with radial layers. Syne typeface for the brand. Login redesigned with a split panel.
New global color system: #0f0a1e background + 3 radial-gradient layers (cyan, purple, pink)
Syne typeface applied to every heading and the Klaapy brand
Login: split panel with branding on the left + form on the right — no more repeated titles
Sidebar: logo + tagline with a text gradient
Cards and overlays with backdrop-blur and rgba borders to take advantage of the transparent background
You can now generate a B variant of the copy directly from the post modal. The system calculates the CAFS Score for both versions.
Variant B generation with Claude AI — a different angle from the original (emotional vs. informative)
ABTestPanel: real-time comparative score, winner selector
Content Brief: detailed recommendations when the CAFS Score is below 60
Post preview updated with Variant B support in the modal
Posts with ab_variant_copy now show both versions in the detail view
Analyze up to 5 of your competitors' Instagram accounts and get personalized CONTENT, TIMING, HASHTAG, and ENGAGEMENT strategies.
Analysis of up to 5 competitors per session via the Instagram Graph API
Generated strategies: best times, formats, top hashtags, and engagement patterns
Growth predictions based on real data from the last 30 days
Audience DNA: active users by hour, day, and preferred content type
Unified dashboard with tabs: Analysis · Strategies · Predictions · DNA
First public version. Connect your Meta account, create posts with a real-time CAFS Score, and manage your inbox from one place.
CAFS Score: 12 content signals analyzed in real time as you type
Direct publishing to Facebook Pages and Instagram Business via the Meta Graph API v22
Unified inbox: every FB + IG comment with status and platform filters
Visual calendar with color-coding by score range
Audience Intelligence: per-follower quality score and anomaly alerts
Passwordless authentication via magic link
Multi-tenant: multiple workspaces with role-based access control (Owner, Admin, Editor, Viewer)