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.

127 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" | "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: [
43 "Connect databases and storage to a project",
44 "Configure connections for production and preview environments",
45 "Manage connection credentials alongside environment variables",
46 ],
47 today: { label: "Environment variables", path: "settings/secrets" },
48 },
49 {
50 key: "daemons",
51 title: "Daemons",
52 section: "Project",
53 summary: "Long-running background processes for your project.",
54 why: "Keep queue consumers and background workers running alongside your app, with their configuration and activity in the same project.",
55 plans: [
56 "Run containerized background processes",
57 "Manage instances, restarts and environment variables",
58 "See process health and logs alongside your deployments",
59 ],
60 },
61 {
62 key: "analytics",
63 title: "Analytics",
64 section: "Project",
65 summary: "Who visits the deployed apps, without cookies.",
66 why: "Visits, pages and referrers for each app, private by design, from Cloudflare's own analytics.",
67 plans: ["Visits, pages, referrers and countries", "No cookies, no personal data", "Per deployment and per preview"],
68 },
69 {
70 key: "firewall",
71 title: "Firewall",
72 section: "Project",
73 summary: "Rules for who may reach the project's deployed apps.",
74 why: "Deployed apps run on Cloudflare. Rate limits, bot protection and IP rules, per app and environment.",
75 plans: ["Rate limits and bot protection", "IP and country rules", "Password-protected previews"],
76 today: { label: "Deployments", path: "deployments" },
77 },
78 {
79 key: "flags",
80 title: "Flags",
81 section: "Project",
82 summary: "Turn features on per environment or per user, without a deploy.",
83 why: "Ship code dark and turn it on when ready, for some users first, at the edge, with no deploy.",
84 plans: ["Flags read at the edge by deployed apps", "Rollouts by percentage, user or environment", "Reminders to clean up flags once fully on"],
85 today: { label: "Deployments", path: "deployments" },
86 },
87
88 // --- Security -------------------------------------------------------------
89 // The overview, secret scanning, code scanning, vulnerabilities and the
90 // dependency graph are built: see routes/repo/security-*.tsx.
91
92 // --- Observe ------------------------------------------------------------
93 {
94 key: "uptime",
95 title: "Uptime",
96 section: "Observability",
97 summary: "Checks that the app answers, from around the world.",
98 why: "Know the app is down before your users tell you, and who was told.",
99 plans: ["Checks from many places", "Alerts by email and webhook", "A public status page"],
100 },
101
102 // --- Insights -------------------------------------------------------------
103 {
104 key: "delivery",
105 title: "Delivery",
106 section: "Insights",
107 summary: "Lead time, deploy frequency, change failure rate and time to restore.",
108 why: "The four numbers that say how well a team ships, measured from what actually happened in g1t.",
109 plans: ["DORA metrics from merges and deployments", "Review and queue time", "Trends by week and by project"],
110 },
111 {
112 key: "costs",
113 title: "Costs",
114 section: "Insights",
115 summary: "What the project costs, by workflow run, sandbox, build and app.",
116 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.",
117 plans: ["Cost by kind of work and by work item", "Cost per merged change", "Budgets per project"],
118 },
119];
120
121export function roadmapItem(key: string): RoadmapItem | undefined {
122 return ROADMAP.find((item) => item.key === key);
123}
124
125export function roadmapIn(section: RoadmapItem["section"]): RoadmapItem[] {
126 return ROADMAP.filter((item) => item.section === section);
127}