instagram-carousel is a web application for creating Instagram carousels from a topic typed into a text box. A creator enters a topic, the product generates a multi-slide carousel draft, and the creator selects from popular industrial-style carousel templates and customizes or modifies the slides to match their own interest. The product's output is intended for Instagram, so slides are composed at Instagram's native 4:5 portrait aspect ratio.
The audience is independent Instagram creators — designers, small-brand founders, and meme-native marketers — who want carousels that look art-directed rather than auto-generated. The product is delivered as a first-party web application with application-owned accounts, a shared backend API, and an AI model gateway for slide generation.
This document is the System Requirements Document for the project named instagram-carousel.
instagram-carousel is delivered as three first-party tiers plus supporting infrastructure:
Actors. The single active human actor is the Carousel Creator. The AI model provider (reached through the LiteLLM gateway) is a non-persona system actor that produces generated slide content on the backend's request.
Accepted behavior. A creator enrolls or verifies identity, enters a topic in a text box, receives an AI-generated carousel draft, browses popular industrial-style templates, selects one, and customizes or modifies the generated slides — text, layout, font, and color — to their own interest, with the draft saved to their account for return visits.
Exclusions. The product does not publish, post, or schedule to Instagram; it produces carousel output intended for Instagram. It does not provide stock photography, social analytics, or team collaboration.
Removed from scope
The product is a first-party, application-owned web tool. Identity is application-owned: a new Carousel Creator enrolls through Sign Up, and a returning creator verifies through Login. Landing, Sign Up, and Login are anonymously reachable; Create Carousel, Templates, and Carousel Editor require a verified session because they read and write creator-specific saved carousels.
AI generation is performed by the backend through the LiteLLM gateway; the creator never interacts with the model provider directly. All generation, template selection, and editing outcomes are observable in the first-party UI and persisted to the creator's account so work can be resumed.
Everything described in this document is current scope. No future-horizon features are committed.
FR-1 — Create a carousel from a topic (explicit) As a Carousel Creator, I should enter a topic in a text box and receive an AI-generated Instagram carousel draft, so that I can start from content rather than a blank canvas.
FR-2 — AI generation of slides from the topic (required_inference) As a Carousel Creator, I should have the backend generate slide content from my topic through the AI gateway, so that the draft contains usable slide copy.
FR-3 — Browse popular industrial-style templates (explicit) As a Carousel Creator, I should browse popular industrial-style carousel templates, so that I can choose a look that fits my topic.
FR-4 — Select a template (required_inference) As a Carousel Creator, I should select a template and apply it to my carousel draft, so that the draft adopts that template's layout, font, and color defaults.
FR-5 — Customize or modify the carousel (explicit) As a Carousel Creator, I should customize or modify the generated carousel slides as per my interest, so that the final carousel reflects my own intent.
FR-6 — Self-service enrollment (required_inference) As a new Carousel Creator, I should enroll through Sign Up, so that I can generate and save carousels under my own account.
FR-7 — Returning verification (required_inference) As a returning Carousel Creator, I should verify through Login, so that I can access my saved carousels and templates.
FR-8 — Instagram output constraint (explicit) As a Carousel Creator, I should see my carousel composed at Instagram's 4:5 portrait aspect ratio, so that the output is intended for Instagram.
Muse: Virgil Abloh — industrial carousel studio with quotation-mark swagger.
Headline treatment: Archivo Black, uppercase, tracking -0.02em, flush-left, with a single word or phrase wrapped in literal quotation marks (e.g. "CAROUSEL").
Palette (light mode):
| Role | Hex |
|---|---|
| Background (concrete-white) | #F2F0EB |
| Surface | #FFFFFF |
| Text / primary | #111111 |
| Accent (safety orange) | #FF5A1F |
| Muted | #8A8578 |
| Construction-tape yellow | #F5C518 |
| Exposed grid lines | #D9D5CC |
| Template backdrop (concrete-grey) | #E8E4DC |
Concrete-white carries ~60% of surface; ink black is primary for type, buttons, and label bars; safety orange is the single hot accent used sparingly on the AI-generate CTA, active template tabs, and the hazard-stripe band — never as a background fill. Yellow appears only as thin 4px tape stripes and small quoted badges. Muted grey handles metadata and disabled states. No blue anywhere.
Typography: Headings Archivo Black; body and UI Space Grotesk at 400/500; label chips 11px uppercase, tracking 0.14em. Scale 1.333 modular on a 4px baseline: 96/72/48/32/24/18/16/13. Mobile headline clamp(40px, 11vw, 72px); desktop hero wordmark up to 128px. Numerals tabular for slide counts (01/08).
Shape language: Hard edges, zero border-radius on cards and buttons; the only curves are the 4:5 carousel slide previews. 2px ink borders on every interactive surface with a 4px solid offset shadow in ink or orange. Hazard stripes (repeating 45° orange/black, 12px band) as section dividers. Exposed 1px grid lines in #D9D5CC marking the 12-column layout.
Layout: Asymmetric 12-column grid with a persistent 240px left rail carrying the wordmark, nav, and a vertical "QUOTED" ticker. Hero uses a 9/3 split. Templates page is a masonry of 4:5 previews. Editor is a three-pane filmstrip/canvas/inspector with small-caps label/value rows.
Imagery: No stock photography. Visuals are the carousel slides themselves — real 4:5 previews in industrial template styles (concrete textures, oversized type, label frames). Supporting graphics: construction-tape stripes, exposed grid lines, halftone dots at 12% opacity, corner registration marks. Template thumbnails sit on #E8E4DC backdrops with 1px ink borders.
Accessibility: Readable text and controls stay whole at 375px, 768px, and 1280px, wrapping or scaling to fit; decoration may bleed but never covers text or controls.
The public entry is a 9/3 split on the concrete-white ground. Left 9 columns: the word "CAROUSEL" in Archivo Black at clamp(56px, 12vw, 128px), uppercase, wrapped in literal quotation marks, flush-left and bleeding slightly past the left margin so the opening quote sits at x=0. Beneath it, one line of Space Grotesk body ("Type a topic. Get a carousel. Remix the whole thing.") and a black rectangular button with orange offset shadow reading "START A CAROUSEL". Right 3 columns: a vertical stack of three 4:5 template previews, each tagged with a small-caps label and slightly rotated (-2deg, 0deg, +1deg) so they read as physical prints pinned to the page. A 12px hazard-stripe band runs full-bleed across the bottom of the hero, marquee-scrolling left. No centred layout, no gradient, no subtext paragraph — the type and pinned previews carry it. At 375px the wordmark wraps to two lines with quote marks kept whole.
Interaction Model: Animated Motion Tempo: expressive Hero Dimensionality: flat
Landing Hero Motion Brief
prefers-reduced-motion freezes the marquee and swaps tag-flip for a static orange tag.frontend, backend, database, litellm, postgres.
Type a topic. Get a carousel. Remix the whole thing.

Type a topic. Get a carousel. Remix the whole thing.
No comments yet. Be the first!