LinkedIn Posts Automation
com.aoneahsan.a1la
LinkedIn Posts Automation is a zero-cost, ToS-safe Cloudflare Worker (cron + KV + Supabase) that auto-publishes your pre-written LinkedIn posts to your personal profile via LinkedIn's official Posts API โ each with a card image and the link in the first comment, on a configurable engagement-weighted schedule, with Supabase as the source of truth so nothing is ever reposted โ plus a React/Capacitor admin dashboard to monitor and configure it all.
At a glance
- Category
- full-stack
- Status
- Live
- Started
- Jun 2026
- Last updated
- 2 months ago
Identifier
com.aoneahsan.a1laPreview
Take a look before you go
The still below is painted first, then the running site loads behind it โ so the dialog is never an empty rectangle waiting on a network round trip. Where a site allows framing the live app takes over; where it refuses, the still stays and says so. Nothing is requested until you press.
About
What this actually is
The obvious way to post on a schedule is to drive a browser and click the buttons for somebody.
This does not do that.
Posts go out through LinkedIn's official Posts API, so the account is doing something the platform has a documented route for rather than something that only looks like a person typing. Nothing here scrapes a page. Nothing here signs in as you.
That decision costs the project every convenience a scraper would have bought, and it is the reason the rest of the design looks the way it does.
A Cloudflare Worker holds the schedule.
It builds a daily plan weighted by engagement, inside windows you set yourself, then publishes what the plan picked: the post, its card image, and the link placed in the first comment rather than in the body.
Why the first comment helps is not a claim I will make here. It is what the tool does. What LinkedIn does with it afterwards belongs to LinkedIn.
Supabase is the source of truth for selection.
That sounds like plumbing until you think about what a scheduler is for. A post published twice is worse than a post never published, because the second copy is visible to everybody who saw the first and there is no undo that removes the memory of it.
So selection happens against the database, and a published item is never picked again.
The words themselves are written in advance. A pipeline reads pre-written post files, seeds the database from them, and the scheduler works through what is there. Nothing generates text at publish time.
That is a smaller product than one that writes for you, and smaller on purpose.
A queue of sentences somebody meant is worth more than a queue a machine filled overnight, and the scheduler's only job is deciding when each of them goes out.
The dashboard is a real application rather than a settings file.
It is React with Capacitor, signed in through Firebase, reading over TanStack Query, and it exists so cadence can be watched, priorities and windows edited, and a single post skipped or pushed back into the queue without anyone going near the worker.
There is a second way in for the times a dashboard is the slowest thing to reach for: an operator API behind a bearer token, giving status, logs, the current plan and a manual run. Configurable email notifications carry the digests, the finished runs and the warnings.
Now the part that does not go away.
LinkedIn's authorisation is renewed by hand, roughly every 60 days. The system warns before the token expires and halts cleanly on a 401 instead of hammering a dead credential.
It cannot renew itself.
This is automation with a standing appointment, which is the honest description and the thing a page like this usually leaves out, because runs itself reads better than runs itself until the sixty-first day.
Writing that limit down was cheaper than being surprised by it twice. The documentation says so in the same place it says everything else the API will not do.
The whole stack sits on free tiers. A Worker on a cron, a Postgres database, a small dashboard: none of it needs a server kept alive, and none of it carries a bill that grows with the number of posts.
It is at a1la.aoneahsan.com.
The re-authorisation is still in the calendar, and it always will be.
Worth knowing
- Compliance is the feature, not an afterthought โ the whole design is built around LinkedIn's sanctioned `w_member_social` path: official Posts API only, no browser automation, no scraping, and a hard cap of 4 posts/day well under LinkedIn's 150/day member limit.
- A database as a repost firewall โ making Supabase the single source of truth with a never-reselect RPC means a posted row can never be picked again, so re-running, re-seeding, or adding content never causes a duplicate post.
- Pure, testable scheduler โ the scheduling math (`planTierCounts`, `pickWeightedTimes`, `assignTiers`, `decideTick`) is isolated as a pure module, separate from all I/O, which is a deliberate, reviewable design choice.
- Two API surfaces, two auth models, one Worker โ a bearer-token operator API for headless control and a Firebase-ID-token dashboard API (with an email allowlist) coexist in the same Hono Worker, and the Supabase service key never leaves the server.
- First-comment link placement on purpose โ putting the URL in the first comment instead of the post body is a real LinkedIn engagement tactic, implemented as a best-effort step that never blocks the post.
- Zero paid services end to end โ Cloudflare Worker + KV + Supabase + Firebase Hosting + Cloudflare Email Routing, all on free tiers, with cards bundled into the Worker so there's no asset CDN bill.
- Brutally honest constraints โ the README and CLAUDE.md openly document the 60-day manual re-auth (solo apps get no refresh token), the lack of personal-post analytics (timing is heuristic), and the absence of comment auto-reply (partner-gated), instead of pretending these are solved.
Built with
- Cloudflare Workers
- Hono
- TypeScript
- Supabase
- PostgreSQL
- Cloudflare KV
- React 19
- Vite
- Tailwind CSS
- Capacitor
- Firebase
- TanStack Query
Key features
What it does, and what that costs to build
Each of these is a capability the stack genuinely provides. None of them is an outcome nobody measured โ there is no "cut onboarding by 40%" on this page, because no one measured onboarding.
- Tier-aware engagement-weighted daily post scheduler with configurable windows
- Publishing through LinkedIn's official Posts API with card image and first-comment link
- Supabase source-of-truth selection that never reposts a published item
- Bearer-token operator API for headless status, log, plan, and run control
- React and Capacitor admin dashboard to monitor, configure, and requeue posts
- Content pipeline that parses pre-written post files and seeds the database
- Token lifecycle handling with expiry warnings and clean 401 halts
- Configurable email notifications for digests, completions, and token expiry
Screenshots
5 slots, 1 of them filled in
These are designed frames, not pictures. Each one records what belongs in the slot and at what width; the capture itself is taken from the running app. Drawing a fake screenshot here would put an image on the site that no build has ever produced.
Timeline
Still being worked on
Jun 2026
Work started
The earliest month on record for LinkedIn Posts Automation.
Sep 2026
Last change
Status is completed โ 2 months ago. Ongoing, so this row moves whenever something lands.
Questions
Common questions
The questions that actually arrive, answered in the first sentence.
- Who built LinkedIn Posts Automation?
- Ahsan Mahmood built it alone, and it is at a1la.aoneahsan.com. One person wrote the Cloudflare Worker that runs the schedule, the Supabase schema that decides what publishes next, the content pipeline that seeds it and the React and Capacitor dashboard that operates it. The pieces are Hono on Workers with Cloudflare KV, Postgres on Supabase, and TanStack Query with Firebase Google sign-in on the admin side. Nothing here was assembled from a template, which is also why the awkward parts, such as the manual re-authorisation, are written down rather than hidden.
- Does it scrape LinkedIn or drive a browser?
- No. Publishing happens through LinkedIn's official Posts API, and there is no headless browser, no page scraping and no borrowed session cookie anywhere in the design. That is a limit rather than a feature, because it rules out everything the API does not expose and leaves the product living inside somebody else's documented boundary. What LinkedIn permits, rewards or changes next is theirs to decide, and it is not something this page will speak for. The tool does what the API allows and stops at that edge.
- What happens when the LinkedIn token expires?
- It stops, and it tells you first. Authorisation has to be renewed by hand roughly every 60 days, so the system watches the expiry date, warns ahead of it, and halts cleanly on a 401 rather than retrying against a credential that is already dead. Configurable email notifications cover digests, completed runs and the expiry warning itself. There is no way around the renewal from inside the product, and pretending otherwise would only mean the queue stopped publishing on a morning when nobody was looking.
- Can the same post be published twice?
- No, because selection reads from the database rather than from a file on disk. Supabase is the source of truth: each item carries its published state there, and the scheduler picks only from what has not gone out yet. The seeding pipeline can be re-run over the same pre-written post files without sending anything a second time. That matters more than it sounds, because a duplicate is visible to everyone who saw the first one and deleting it does not undo having sent it.
- Does LinkedIn Posts Automation work on iPhone?
- No, there is no iOS build. The scheduler is a Cloudflare Worker and never runs on a phone at all, while the admin dashboard is a web application any browser can open, packaged with Capacitor for Android. There is no Apple Developer account behind this work, so nothing here has been submitted to the App Store. The only product link the record carries is the web one at a1la.aoneahsan.com, and that is the surface worth checking.
Keep looking
More full-stack products
- CL
ClearHire
com.aoneahsan.clearhire
A hiring platform built around one idea: employment claims should be checkable. Resume builder, candidate and company workflows, a verified-employment system, and 50+ career tools.
- TR
Trizlink
com.trizlink.app
Branded short links, link-in-bio pages, click analytics and a suite of utilities.
- LA
LabFlow
com.aoneahsan.labflow
Multi-tenant laboratory information system across three production surfaces.