Postique: AI Marketing Employee
← All WritingI wouldn’t be writing this if I had bailed on a school showcase.
I applied to present an anomaly detection project I had built for my dad at DePaul’s Jarvis Innovation Showcase, and I got selected. I had been waiting months for it. Then I read through what everyone else was presenting and decided mine wasn’t worth showing, and the morning of it I told myself I wasn’t going. I went anyway, because I had waited too long for that spot to give it up. I got there pretty last minute and stood at my table most of the evening while people walked past. The first person who stopped and asked about what I built was Harper, and that’s how I ended up as an engineering intern at 2389. I started in the middle of June, so I’ve been here about two months as I’m writing this.
Postique is what I built. It’s an AI marketing employee, and it runs our marketing now. It starts on its own at whatever time you set, and mine runs every Sunday at 6 am. It reads the feedback I left the day before, checks what’s happening in our space, plans topics against our strategy, writes each post for every channel we use, makes the videos, runs its own checks, and puts everything on a calendar for me to approve.
It runs social for our brand, the one whose blog you’re reading, and it also runs JEFF.ceo, one of our products - agent that handles Gmail, contacts and calendar for you.

Why I wanted to build this
When I first learned about 2389, the first thing I did was check their Instagram and their other social media to see what was available online. Most of the pages were empty, and at the same time I could see what cool projects people here were building. The work happening at 2389 barely existed anywhere outside the building. People here build interesting things every week and nobody outside was seeing any of it.
That bothered me because I find most of the companies I care about by scrolling. If I had wanted to find 2389 a year ago I couldn’t have. There was nothing to find. I thought the place deserved to get seen, so I wanted to run our social media.
I told Harper that and he said I should automate it. So that’s how I came up with this system.
Okay, but why not just use ChatGPT?
I get this question the most and it’s fair. Writing the posts was never the hard part. Any decent model writes a fine caption if you give it context. The hard part is everything around the writing.
In a chat window you are the pipeline. You bring the idea, paste the brand voice, ask for the post, fix the tone, find a photo, decide when to publish, and next week you start over from an empty box because the chat kept none of it.
Postique keeps the context. It knows what we already published so it won’t pitch me the same topic twice. We run Instagram, LinkedIn, TikTok, YouTube, Threads and X, and it writes for each one separately, since what works on LinkedIn has nothing to do with a TikTok script. It learns our voice from real posts people on our team wrote. It knows our strategy, so an idea a founder types on Monday beats whatever is trending on Tuesday. And when I reject a draft, I tap a reason, and the next run reads that reason before it writes anything.
It worked in a week and I’ve been fixing it since
The first working version took about a week. I had expected it to take most of the summer, and then the week turned out to be the easy part. I’ve been refining it every day since and there’s always something to fix the next day.
Most of what broke came from trusting the model with rules I should have put in code.
2389 and JEFF.ceo came out sounding like the same company, generic and too formal. I kept rewriting the voice description, professional but approachable and so on, and the output never changed. What worked was feeding it real posts and making sure it was actually learning from them.
The videos ran on one hardcoded template so everything looked identical. I let the model write the video code from scratch instead and then half the renders failed. One of those failures was a browser installed in a different place than where the renderer looked for it, and it killed every cold start for days before I found it.
Topics kept coming back off-brand and I couldn’t figure out why. A missing Python dependency had been crashing the research job for over a week, so it never scraped our website once. Nothing in the logs complained. It stopped working and kept producing output that looked fine.
Early on it also decided a brand with one published post was a well-established account, because it had turned that one post into eight channel versions and counted them as eight pieces of history. It explained the decision clearly and it was still wrong.
After that most of my fixes had the same shape. I stopped asking the model to follow a rule and put the rule in code, then gave the model a way to correct itself when the code rejected its work. The model writes, the code checks it, I decide.

The part where I thought it was pointless
Halfway through I stopped believing in it.
The posts weren’t relevant enough to publish. The visuals looked AI-generated in the way people scroll past without thinking about it. And it couldn’t auto-post, so there was still a person at the end copying and pasting into five apps. I’d been telling myself the point was to make a social media manager’s life easier, and what I had made was more work for them.
I’d been building toward posts that go out with nobody thinking about them, which means automating judgment, and automating judgment gets you spam. Everyone has seen those accounts.
What I should have been building toward is that you never start from zero. The system creates and I decide. Once I saw it that way the pipeline organized itself into steps I could name and fix on their own: research, strategy, writing, QA, approval, posting, learning. Every broken thing turned into one bad step. The missing auto-post button stopped bothering me because approval turned out to be the point.
QA is where I keep the rules a post has to pass before it gets to me. I can write those rules myself or let the system suggest them from what it knows about the brand. Once a rule exists the code enforces it instead of the prompt asking for it.
What I couldn’t see on my own
Showing it to people moved the project more than working on it alone did.
When you look at something you built every day you stop seeing it properly. You only see the part you’re currently fixing. I presented Postique internally and people pointed out things I had stopped noticing, which was more useful than the two weeks I spent looking at it alone.
Two changes came out of that. I lean much harder on our previous posts as context now, which makes the output better and cheaper at the same time, since the system isn’t working out what our brand sounds like on every run. And I store the voice instead of rebuilding it from examples every time.
It learns from every rejection
I didn’t plan the feedback loop. I built it because I got tired of typing the same correction.
Around week two I was rejecting drafts and writing a paragraph about what was wrong, and then the next batch made the same mistake and I wrote the paragraph again. That’s what makes people quit a tool. Correcting it costs you the same effort every time.
Now every rejection takes one tap and comes with a reason attached: off-brand, boring, sounds like AI, wrong facts, bad topic. One tap matters because nobody fills in a text box they have to think about. The system stores every manual edit as a diff, and there’s a field where I paste what I published instead, which gives me the best signal in the whole product.
So before any content work starts, a job reads the new feedback and turns it into a short memo, and the agent reads that memo before it does anything else. There’s no training run and no fine-tuning. I told it once that walls of hashtags look desperate and it hasn’t done it since.
The videos are code
Postique makes short videos with no video model in the stack. When it needs one, the model writes a motion graphics program, real code with springs and easing curves, and a render server picks it up, turns it into an MP4, and shuts down.
I picked this on purpose. A video model gives you something close to what you asked for and something different every time you ask. I needed our logo, our hex codes, our type, a cut that lands on the frame I chose, and the same file if I run it twice.
Code gives me that, and it gives me an error message. When a render fails I get a stack trace the model can read, so it fixes its own code and tries again. A generated video doesn’t fail that way. It comes back worse and there’s nothing specific to hand back. Code can also put a real screenshot of our product on screen and a video model can’t.
Getting them to look good took longer than getting them to work. My early briefs said things like energetic, modern and punchy, and the videos came out as vague as those words. What fixed it was writing the brief as a shot spec: exact durations, a timecoded shot list, a named transition at every cut, a palette where every color has a job, and a ban list with floating 3D spheres and confetti on it. When I write briefs in numbers I get videos I keep.

What it costs
Running social for two brands costs us 30 to 40 dollars a month, and that covers everything it generates, including video.
The cost I care about more is my attention, and that one I notice instead of measure. Rejections that used to take a paragraph take one tap now, and I edit fewer drafts than I did in June. I want edits per approved post over time out of the database before I say anything stronger than that.
Does it work
Our Instagram had 20 followers when Postique started and it has over 130 now, on an account that had never posted a video. People now comment on the posts, and some of the videos reach past our followers to people who’ve never heard of us, which is what I wanted most and was least sure it could do. We’re at around 10,000 views as I’m writing this.
These are small numbers. What I care about is that they moved at all, from an account that produced nothing for months, and that nobody here spent their week on it.

Stuff I like using
The Idea Board is where I keep notes I haven’t thought through yet. I write something down and pin it, and when I open it later the AI has developed it into a few angles and a hook, with buttons to turn it into a draft, a research topic, or a video. Next to those I pin inspiration clippings, so I drop in a link or a screenshot of a post I liked and get back why it works and what structure is worth borrowing, with a hard rule that it copies the structure and never the words.
The assistant does real work now. If I share a link it reads the page, if I ask about our photo library it looks at the photos, and if I give it a YouTube video it watches the frames and the transcript before telling me what it thinks.

What I learned
I learned how to design a system, which means deciding where the boundaries go, which step owns which job, and what happens when one of them fails. Most of my early problems came from putting a decision in the wrong place and then trying to fix it with better wording.
I learned to ask earlier. The browser path failure and the missing dependency each cost me days, and each one was a ten minute conversation with someone who had seen that error before.
I learned to say my own mistakes out loud instead of quietly patching them, because once I said them out loud I actually fixed them.
Where it goes
Postique runs our channels today and a person approves every post. The memo gets longer every week.
The point of building it this way is that it doesn’t depend on me. Right now it runs two brands and I’m still building it. What I want is for it to run a lot more than two. There are so many small teams with the same problem we had, where everyone agrees the account should exist and nobody has a week to spend on it. I’d like all of them to be using something like this, and I’m going to keep working on it until they can.
Illustrations made with Ian’s Xiaohei illustration style skill.




