Skip to content
codexa

Web apps · React

Content calendar

Plan posts and newsletters by channel and date, and move them from idea to published.

Content calendar starter, as built from its own files
Starter screenshot captured from this template's own build at 1440×900. It shows the template as it ships, not output generated from a prompt.

What you get

An editorial calendar for a small brand: every blog post, newsletter and social post with its channel, owner and publish date, on a board from idea to published. The channels, stages and sample posts live in src/app.ts.

Files

Exactly what is copied into a new project: 12 files, nothing generated.

Raw data: GET /api/v1/templates/app-content-calendar

src/app.ts
src/app.ts
import type { AppSpec } from "./types"; /** Everything this app shows. Edit freely. */export const app: AppSpec = {  "brand": "Draftboard",  "icon": "calendar",  "storageKey": "draftboard-posts-v1",  "entity": {    "singular": "Post",    "plural": "Posts"  },  "title": "Content calendar",  "subtitle": "November plan for the Hearth Coffee Roasters channels",  "titleKey": "title",  "statusKey": "status",  "tones": {    "Idea": "neutral",    "Drafting": "warn",    "Scheduled": "accent",    "Published": "good"  },  "views": [    "board",    "table"  ],  "fields": [    {      "key": "title",      "label": "Title",      "type": "text",      "required": true    },    {      "key": "channel",      "label": "Channel",      "type": "select",      "options": [        "Blog",        "Newsletter",        "Instagram",        "LinkedIn"      ]    },    {      "key": "owner",      "label": "Owner",      "type": "text"    },    {      "key": "publish",      "label": "Publish date",      "type": "date"    },    {      "key": "words",      "label": "Words",      "type": "number"    },    {      "key": "status",      "label": "Status",      "type": "select",      "options": [        "Idea",        "Drafting",        "Scheduled",        "Published"      ]    },    {      "key": "brief",      "label": "Brief",      "type": "longtext",      "hideInTable": true    }  ],  "summary": [    {      "label": "Posts planned",      "kind": "count"    },    {      "label": "Scheduled",      "kind": "count",      "status": "Scheduled"    },    {      "label": "Published",      "kind": "count",      "status": "Published"    },    {      "label": "Words in draft",      "kind": "sum",      "field": "words",      "status": "Drafting"    }  ],  "seed": [    {      "title": "How we pick a single-origin for winter",      "channel": "Blog",      "owner": "Nadia",      "publish": "2026-11-04",      "words": 1400,      "status": "Drafting",      "brief": "Tasting notes from the three finalists, photos from cupping day."    },    {      "title": "November roast drop",      "channel": "Newsletter",      "owner": "Owen",      "publish": "2026-11-02",      "words": 450,      "status": "Scheduled",      "brief": "Ethiopia Guji and the holiday blend."    },    {      "title": "Behind the roaster: Tuesday mornings",      "channel": "Instagram",      "owner": "Nadia",      "publish": "2026-11-06",      "words": 120,      "status": "Scheduled",      "brief": "Short reel, 30 seconds."    },    {      "title": "Why we pay above fair-trade minimums",      "channel": "LinkedIn",      "owner": "Owen",      "publish": "2026-11-12",      "words": 600,      "status": "Idea",      "brief": ""    },    {      "title": "Grind size cheat sheet",      "channel": "Instagram",      "owner": "Jess",      "publish": "2026-10-28",      "words": 80,      "status": "Published",      "brief": "Carousel, 6 slides."    },    {      "title": "Brewing at altitude: reader questions",      "channel": "Blog",      "owner": "Jess",      "publish": "2026-11-18",      "words": 900,      "status": "Drafting",      "brief": "Answer the five most-asked questions from October."    },    {      "title": "Holiday gift guide",      "channel": "Newsletter",      "owner": "Owen",      "publish": "2026-11-24",      "words": 0,      "status": "Idea",      "brief": "Bundles under $40."    },    {      "title": "October in numbers",      "channel": "LinkedIn",      "owner": "Nadia",      "publish": "2026-10-31",      "words": 300,      "status": "Published",      "brief": ""    }  ]};

Remix

Remix this template

Describe what to change and the agent starts from Content calendar's files. The box is already started for you: finish “Start from Content calendar and …”

Agent ready

Creates a free account first; your idea is carried over.

Dependencies

Documented from the template's package.json. The runtime has a prebuilt dependency set for Vite + React + TypeScript, so installs are fast.

  • react^19.1.0
  • react-dom^19.1.0
  • vite^6.3.0
  • @vitejs/plugin-react^4.4.0
  • tailwindcss^4.1.0
  • @tailwindcss/vite^4.1.0
  • typescript^5.8.0

How it runs

Framework
Vite + React + TypeScript
Dev command
npm run dev
Build command
npm run build
Output directory
dist
Port
5173
Entry route
/

Projects run in an isolated sandbox with a live preview. Read the projects documentation for settings, snapshots and deployment.

All templates

Build on Content calendar

Create a free account, start from this template, and ask the AI agent to turn it into your app.