Loading
The Origin Story: DevPostGen did not start as a “personal brand automation platform”. It started as a very simple frustration: "What the hell did I even do this week?"
The problem was never “AI writing posts”. The real problem was:
So the goal became very clear: Capture work automatically, while context is fresh, and turn it into usable content with minimal effort.
Very early, I realized one thing: If I try to build this as a single app, it will collapse under its own complexity.
So I split DevPostGen into three independent but connected systems:
This decision alone removed half the mental load.
The backend looks boring on paper: Node, Express, MongoDB, OAuth, AI. But this is where most hurdles lived.
GitHub activity is not “clean progress”. Commits can be tiny, messy, reverted, or experimental. Feeding raw commit messages to an AI gave garbage output.
So I had to:
Lesson learned: AI quality is directly proportional to input quality.
GitHub OAuth sounds easy until sessions randomly expire or redirects break in local vs production. Passport.js helped, but I still had to deeply understand session lifecycles and secure token storage.
This part wasn’t “hard”, just annoyingly fragile.
AI doesn’t fail loudly. It fails subtly. Sometimes the tone was wrong, or the output felt like marketing nonsense.
I had to:
Treating Gemini like a deterministic API was a mistake. Once I treated it like an unreliable collaborator, things improved.
The frontend looks clean now. It was not clean while building. The challenge wasn’t React — it was flow.
The hardest question was: “What does the developer do first when they open this?”
I iterated on dashboard layout and activity grouping multiple times. My biggest hurdle was adding features before locking the flow. That always backfired. Once I froze the flow, UI decisions became obvious.
I built DevPostGen “dark-mode first” intentionally.
Bad UI doesn’t feel bad immediately. It feels bad after 30 minutes.
On paper, the extension is tiny. In reality, it was the most annoying part.
Chrome extensions reload unexpectedly and kill background scripts. So I had to persist drafts properly and sync state intelligently. You can’t treat an extension like a normal React app.
The popup is small. Every pixel matters. This forced ruthless decisions: fewer buttons, clear defaults, no unnecessary configuration.
Ironically, this made the product better. Constraints sharpen decisions.
Trying to polish too early.
I spent time on animations and micro-interactions before the core loop was bulletproof. Every time I did that, I paid for it later.
Now my rule is simple: Core loop first. Polish last.
DevPostGen taught me that:
DevPostGen isn’t impressive because of AI, OAuth, or React 19. It’s interesting because it solves a real developer problem: turning invisible effort into visible progress.
If you’re building something similar, here’s your takeaway: Don’t start with features. Start with friction. Remove that first.