Skip to content

Where people and agents ship software together. The open-source git platform for the whole job: issues, agents, checks and deploys to the edge.

119 linesCodeBlameRaw
1/**
2 * What a project will have and does not yet: the pages the project menu
3 * shows as Soon, each with a page of its own saying what it will be. One
4 * place, so the menu and those pages never disagree.
5 *
6 * Each entry says what it is for, what it will do, and what to use today,
7 * so a Soon is a promise someone can read, not a greyed-out word.
8 */
9
10export type RoadmapItem = {
11 /** In the address: `/<owner>/<project>/soon/<key>`. */
12 key: string;
13 title: string;
14 /**
15 * Where it lives: a project page whose tabs it joins, a page of its own
16 * in the project's sidebar ("Project"), or the workspace, for what spans
17 * projects (Insights).
18 */
19 section: "Code" | "Issues" | "Deployments" | "Observability" | "Security" | "Insights" | "Project" | "Workspace";
20 /** One line, for the menu's tooltip and the page's lead. */
21 summary: string;
22 /** Why it matters, in two or three sentences. */
23 why: string;
24 /** What it will do. */
25 plans: string[];
26 /** What to use until it exists: a project page, by its path under the project. */
27 today?: { label: string; path: string };
28};
29
30export const ROADMAP: RoadmapItem[] = [
31 // --- Code ---------------------------------------------------------------
32 // Nothing: code is not docs. Docs is its own workspace mode, filterable
33 // by project there, and a project never gets a Docs tab.
34
35 // --- Pages of their own in the project's sidebar ----------------------
36 {
37 key: "storage",
38 title: "Storage",
39 section: "Project",
40 summary: "Configure databases and storage for your project.",
41 why: "Manage the data services your app depends on alongside its deployments, with connections scoped to the right environment.",
42 plans: ["Connect databases and storage to a project", "Configure connections for production and preview environments", "Manage connection credentials alongside environment variables"],
43 today: { label: "Environment variables", path: "settings/secrets" },
44 },
45 {
46 key: "daemons",
47 title: "Daemons",
48 section: "Project",
49 summary: "Long-running background processes for your project.",
50 why: "Keep queue consumers and background workers running alongside your app, with their configuration and activity in the same project.",
51 plans: ["Run containerized background processes", "Manage instances, restarts and environment variables", "See process health and logs alongside your deployments"],
52 },
53 {
54 key: "analytics",
55 title: "Analytics",
56 section: "Project",
57 summary: "Who visits the deployed apps, without cookies.",
58 why: "Visits, pages and referrers for each app, private by design, from Cloudflare's own analytics.",
59 plans: ["Visits, pages, referrers and countries", "No cookies, no personal data", "Per deployment and per preview"],
60 },
61 {
62 key: "firewall",
63 title: "Firewall",
64 section: "Project",
65 summary: "Rules for who may reach the project's deployed apps.",
66 why: "Deployed apps run on Cloudflare. Rate limits, bot protection and IP rules, per app and environment.",
67 plans: ["Rate limits and bot protection", "IP and country rules", "Password-protected previews"],
68 today: { label: "Deployments", path: "deployments" },
69 },
70 {
71 key: "flags",
72 title: "Flags",
73 section: "Project",
74 summary: "Turn features on per environment or per user, without a deploy.",
75 why: "Ship code dark and turn it on when ready, for some users first, at the edge, with no deploy.",
76 plans: ["Flags read at the edge by deployed apps", "Rollouts by percentage, user or environment", "Reminders to clean up flags once fully on"],
77 today: { label: "Deployments", path: "deployments" },
78 },
79
80 // --- Security -------------------------------------------------------------
81 // The overview, secret scanning, code scanning, vulnerabilities and the
82 // dependency graph are built: see routes/repo/security-*.tsx.
83
84 // --- Observe ------------------------------------------------------------
85 {
86 key: "uptime",
87 title: "Uptime",
88 section: "Observability",
89 summary: "Checks that the app answers, from around the world.",
90 why: "Know the app is down before your users tell you, and who was told.",
91 plans: ["Checks from many places", "Alerts by email and webhook", "A public status page"],
92 },
93
94 // --- Insights -------------------------------------------------------------
95 {
96 key: "delivery",
97 title: "Delivery",
98 section: "Insights",
99 summary: "Lead time, deploy frequency, change failure rate and time to restore.",
100 why: "The four numbers that say how well a team ships, measured from what actually happened in g1t.",
101 plans: ["DORA metrics from merges and deployments", "Review and queue time", "Trends by week and by project"],
102 },
103 {
104 key: "costs",
105 title: "Costs",
106 section: "Insights",
107 summary: "What the project costs, by workflow run, sandbox, build and app.",
108 why: "Usage is charged by the workspace; here it is broken down for one project, so you can see what each part of the work costs.",
109 plans: ["Cost by kind of work and by issue", "Cost per merged change", "Budgets per project"],
110 },
111];
112
113export function roadmapItem(key: string): RoadmapItem | undefined {
114 return ROADMAP.find((item) => item.key === key);
115}
116
117export function roadmapIn(section: RoadmapItem["section"]): RoadmapItem[] {
118 return ROADMAP.filter((item) => item.section === section);
119}