Changelog
What shipped, and when.
Written by the person who shipped it, including the entries that say something was wrong. Those are the ones worth reading.
A public site, and the documents behind it
Pricing, security, about, contact and this page, plus a cookie policy, a sub-processor list, an acceptable use policy and a data processing agreement. The legal documents were reachable only by typing their URL before this, which for a compliance page is indistinguishable from not having one.
Resend named as a sub-processor
Invitation email had been going through Resend for several releases while the privacy policy listed five processors instead of six. An undisclosed processor holding email addresses is a disclosure gap, so it is now named there, on the security page and in the data processing agreement, all three reading from one list.
A read-only API for your own workspace
Scoped keys, managed from the settings screen, so posts, accounts and collected figures can be pulled into a warehouse or a dashboard of your own.
The analytics screen
Sixty days of follower history per network and the performance of every post that went out, drawn from readings the collectors had already been taking for weeks. A metric that could not be read shows as unavailable and says why. It is never drawn as a zero.
Carousels can be reordered on a phone
Dragging to reorder the images in a carousel worked with a mouse and did nothing under a thumb, which is the device most of this is done on.
Folders in the composer’s media picker
The picker showed one flat list of every asset in the workspace. It now walks the same nested folders the library does, so a library worth organising is worth organising once.
Recycled posts ranked by what actually performed
The recycler chose by age. It now chooses by measured performance, which is what the metrics collector had been quietly accumulating the whole time.
Competitor discovery moved to a background job
Adding a competitor held the screen while several networks were queried in turn. It now runs behind you and reports what it found, and a profile no network can track is saved anyway with the reason on its face.
What was said to a model, not only what it cost
The AI ledger recorded spend and nothing else, so a bad draft could be counted but never explained. The prompt and the response are now kept with the cost.
Nested folders in the media library
Folders inside folders, and a serving route for media that keeps the storage path unguessable.
Email delivery, and importing posts you already published
Invitations now arrive as real mail with delivery tracked. Posts published outside the product can be imported so the metrics history is not full of holes.
Billing, invitations, seats and account groups
Plans with enforced limits, invitations that cannot hand out a seat the plan does not have, weekly queue slots, notes on a post, and a workspace chat.
Scheduled times stopped drifting across time zones
A scheduled time was being converted through UTC on the way into the form, which walked posts hours earlier on every save in half the world. Every conversion now goes through one tested helper, with the workspace time zone explicit at both ends.
Eleven networks, connected through one OAuth layer
Connections, publishing, the collectors that read back what happened, and the Meta compliance callbacks. Access tokens are encrypted before they touch the database and are never sent to a browser.
Multi-tenant from the schema up
The suite this was extracted from could hold exactly one brand: three of its constraints made a second one impossible to insert. Every table is now scoped to a workspace and protected by a policy the database enforces.
Something here you depend on, or something missing you were waiting for? Say so.