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.

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