Smart Studio — planning and producing Instagram content
A planning and production tool for an Instagram content strategist and their team: an offline-first Android app, a web panel, and a Jalali calendar that knows Iranian occasions.
Live at localand.ir: 190 backend tests, 21 Playwright tests for the web panel, 95 API operations, and an Android app that updates itself.
The problem
A content strategist runs ideas, scripts, the publishing calendar and the work of a camera operator, an editor and a designer across several apps and messenger groups. Foreign tools know neither the Jalali calendar nor Iranian occasions — nobody warns that a cheerful post has landed on a day of mourning — and inside Iran Google Play Services, FCM and Telegram are not things a product can lean on.
A FastAPI backend on PostgreSQL 16, a web panel in React 19 and TypeScript, and a native Android app in Kotlin and Jetpack Compose.
An idea in under two taps. The idea inbox takes text, a voice note or a photo, and fills from Android's Share sheet — from Instagram or any other app.
One pipeline, from idea to analysis. Idea, script, approval, shoot, edit, review, schedule, publish, analyse — as a kanban board with a history of every change. Script templates (hook, body, CTA, caption, hashtags) and shot lists; tasks with deadlines for each team member; and 48 hours after publishing, a reminder to log the numbers and a lesson learned.
A calendar that knows the occasions. Monthly and weekly Jalali views with official, religious and marketing occasions, and a warning when cheerful content falls on a day of mourning.
Android, offline first. A Room cache, delta sync and an outbox keyed for idempotency, so work done on the metro is never recorded twice. Notifications without Google Play Services, and builds for Cafe Bazaar, Myket and Google Play.
A web panel for the desk. Kanban and calendar with drag and undo, global
search on Ctrl+K, and autosave.
One design system for two platforms. Colour tokens come from one source for web and Android, in light and dark, and the build fails if any of the 429 colour pairs it checks falls below WCAG AA contrast.
A multi-tenant backend — organisation, brand, page — with roles and permissions, a job queue on PostgreSQL itself, notifications through Bale and Telegram bots, login codes from the Bale bot, and Persian search that tolerates ی/ک variants, the half-space, digits and typos.