Skip to content
D · 03 · TECHNICAL WRITE-UP

Clout Cannon.

A LinkedIn content factory, in four rooms.

Ideas in, polished LinkedIn posts out. Each post moves through four rooms — Supply, Writer Camp, Art Department, World — with AI assistance at every stage and a central Brain that keeps brand voice + visual style consistent across them.

01 · THE FOUR ROOMS

A post lives in one room at a time.

Each room has its own affordances, its own AI tools, and its own visual theme. The factory metaphor is also how the code is organised.

RoomJobWhat it does
Supply RoomIngredient collection + bundlingDrop in URLs, text notes, images. Gemini bundles related ingredients automatically. Ingredients are reusable — one source clip can seed multiple posts. Visual indicators show used vs unused.
Writer CampAI writing + editingAuto-generates a post from the chosen ingredients using your Writing Vibe. Six editing tools (longer / shorter / more professional / more casual / fix typos / add humor). Twelve writing personas via the Archetype Intervention modal. Real-time AI feedback + quality scoring.
Art DepartmentVisual content generationSix visual archetypes (3 illustrations + 3 photography styles). Gemini image generation conditioned on brand guidelines stored in the AI Brain. Skip-to-World or attach generated images to the post.
WorldSchedule + publishSchedule posts for LinkedIn. Published-post management, engagement tracking, real-time analytics. Cloud Function carries the actual LinkedIn API integration.
02 · THE AI BRAIN

The settings all four rooms read from.

The Brain panel is accessible from any room via Brain Settings. It holds two tabs today, Illustrator and Archetype Intervention, with a Writer tab next on the roadmap:

  • Illustrator — brand guidelines builder (colours, visual style, composition, mood, typography), AI style inference (upload images / docs / URLs for Gemini to analyse), view/edit mode with edit protection, six visual archetypes.
  • Writer — writing style calibration, voice consistency training, tone preferences, example post analysis. Coming next.
  • Archetype Intervention — twelve writing personas surfaced as a modal from Writer Camp when a post needs a sharper voice.
03 · VISUAL ARCHETYPES

Six. Three illustrations, three photography styles.

Every visual the Art Department makes is conditioned on one of six archetypes. Naming the register up front is what makes the result usable. The three illustration styles map cleanly to a Corporate / Editorial / Anti-design axis; the three photo styles map to the same axis in a different medium.

ArchetypeBucketNote
Corporate MemphisIllustrationThe cartoon style: flat vectors, bright colours, disproportionate limbs, minimal facial features. The dominant LinkedIn-illustration default.
Conceptual EditorialIllustrationVisual metaphor / allegory for complex ideas. Textured, nuanced palettes. The NYT-op-ed register.
Surrealism / BrutalismIllustrationReality mixed with dreamlike elements. Raw shapes, anti-design, illogical compositions.
Authentic & CandidPhotographyAnti-stock. Unscripted moments, real emotions, natural light in real work environments.
High-Concept MetaphoricalPhotographyObjects as symbols. Staged, clean, minimalist. Chess pieces = strategy, lightbulbs = ideas.
Creative AbstractPhotographyNon-representational. No recognisable subjects — form, colour, line, texture, motion.
04 · NOTABLE DESIGN CHOICES

The non-obvious decisions.

Room transitions are explicit
Each room is a distinct stage with distinct affordances. A post can't be 'almost in two rooms at once'. Room transitions are explicit, the Post model carries the room as state, and the navigation shows you which room you're in.
Ingredients are reusable
The same source clip can seed multiple posts. The Supply Room tracks used vs unused. Bundle suggestions include reused ingredients so a long-running ingredient (a great quote, a chart) keeps earning.
The AI Brain is a configuration layer, not a model layer
Brand guidelines, voice calibration, archetype preferences all live in one Brain panel accessible from any room. The models call the Brain for their context; the Brain isn't called from inside any single room's logic. Re-tuning the brand once re-tunes every output.
Chaos Canvas is the design language
Neon cyberpunk register — electric blue / hot pink / neon green per room theme, glitch text, scanlines, neon-glow buttons. A deliberate contrast with the LinkedIn-default Corporate Memphis aesthetic the tool itself can produce. The tool looks loud so the output can look quiet.
Backend deploys only go through GitHub
Backend deploys go git push → Cloud Build → Cloud Run, never a manual gcloud run deploy. The deployment pipeline is built around that, and a manual deploy breaks it.
05 · STACK

What runs underneath.

LayerDetail
Backend API.NET 8 (Ecp.Api). Controllers per room — IngredientsController, PostsController, ArtDepartmentController, WorkflowController, BrandGuidelinesController.
Domain modelsEcp.Application. Ingredient, IngredientBundle, Post (with room tracking), AIArtist (visual archetype defs), BrandGuidelines.
FrontendReact 19 + TypeScript (ecp-frontend). One page per room (SupplyRoomPage, EditingRoomPage, ArtDepartmentPage, ThePublicPage). Material Symbols icons, Space Grotesk typography.
AI modelsGemini 3 Flash for text generation + bundle suggestions, Gemini 3.1 Flash Image for the Art Department.
DataFirestore — real-time updates so room transitions surface immediately across surfaces.
HostingCloud Run (europe-west1) for the .NET API. Firebase Hosting (rutger-social.web.app) for the React frontend. Cloud Function for the LinkedIn publish step.
CI/CDgit push origin main → Cloud Build → Cloud Run for backend. npm run build → firebase deploy for frontend.
WHY THIS EXISTS

Writing a good LinkedIn post is hard work, and most tooling solves the wrong half of the problem (scheduling, analytics, performative cadence tracking). Clout Cannon goes after the other half: turning an interesting input into a piece of writing that's honest about its register, paired with a visual that's honest about its archetype.

Read the source on GitHub →