diff --git a/apps/web/package.json b/apps/web/package.json index c780c59..f3804ed 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,7 +4,7 @@ "version": "1.0.0", "type": "module", "engines": { - "node": ">=22.12" + "node": ">=22.22.0" }, "scripts": { "dev": "astro dev", @@ -13,14 +13,12 @@ }, "devDependencies": { "@astrojs/check": "^0.9.10", - "astro": "5.18.2", - "autoprefixer": "^10.6.1", - "postcss": "^8.5.30", - "tailwindcss": "^3.4.19", - "typescript": "^5.9.3" + "astro": "7.4.0", + "typescript": "^6.0.3" }, "dependencies": { - "gsap": "^3.15.0", - "lenis": "^1.3.27" + "@fontsource-variable/funnel-display": "^5.3.0", + "@fontsource-variable/funnel-sans": "^5.3.0", + "@fontsource-variable/geist-mono": "^5.3.0" } } diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js deleted file mode 100644 index ba80730..0000000 --- a/apps/web/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -export default { - plugins: { - tailwindcss: {}, - autoprefixer: {} - } -}; diff --git a/apps/web/public/favicon-16.png b/apps/web/public/favicon-16.png index 32dfb9a..e12288f 100644 Binary files a/apps/web/public/favicon-16.png and b/apps/web/public/favicon-16.png differ diff --git a/apps/web/public/favicon-32.png b/apps/web/public/favicon-32.png index 3be159c..ca78286 100644 Binary files a/apps/web/public/favicon-32.png and b/apps/web/public/favicon-32.png differ diff --git a/apps/web/public/favicon-48.png b/apps/web/public/favicon-48.png index d7aef35..a6a0265 100644 Binary files a/apps/web/public/favicon-48.png and b/apps/web/public/favicon-48.png differ diff --git a/apps/web/public/logo-devmap.png b/apps/web/public/logo-devmap.png deleted file mode 100644 index 7f465d8..0000000 Binary files a/apps/web/public/logo-devmap.png and /dev/null differ diff --git a/apps/web/public/logo-mark.png b/apps/web/public/logo-mark.png new file mode 100644 index 0000000..4426e0a Binary files /dev/null and b/apps/web/public/logo-mark.png differ diff --git a/apps/web/public/logo.png b/apps/web/public/logo.png deleted file mode 100644 index ac072aa..0000000 Binary files a/apps/web/public/logo.png and /dev/null differ diff --git a/apps/web/src/components/docs/DocsSidebar.astro b/apps/web/src/components/docs/DocsSidebar.astro index 0fb05cb..41cd1f5 100644 --- a/apps/web/src/components/docs/DocsSidebar.astro +++ b/apps/web/src/components/docs/DocsSidebar.astro @@ -99,8 +99,8 @@ const tree = buildTree(headings); diff --git a/apps/web/src/components/landing/AiAgentsSection.astro b/apps/web/src/components/landing/AiAgentsSection.astro deleted file mode 100644 index 60566e4..0000000 --- a/apps/web/src/components/landing/AiAgentsSection.astro +++ /dev/null @@ -1,234 +0,0 @@ ---- - -const flows = [ - { command: "devmap init", output: "DEVMAP.md" }, - { command: "devmap analyze", output: ".devmap/snapshot.json" }, -]; - -const compatibleTools = [ - "Claude Code", - "Codex", - "Gemini CLI", - "Cursor", - "Copilot", -]; ---- - -
-

- Your AI agent is only as good as its context. -

- -

- Without DevMap, your AI agent explores your codebase blindly, opening - files one by one, guessing what matters, rebuilding context from scratch - every session. -

- -

- With DevMap, your agent gets a ready-made project map. Framework, entry - points, critical files, data flow, all structured, all accurate, all - generated from static analysis. -

- -
- {flows.map((flow) => ( -
- {flow.command} - - {flow.output} -
- ))} -
- -

- Your AI agent reads the map. Not the entire codebase. Faster execution. - Lower token usage. Better results. -

- -

- Compatible with: {compatibleTools.join(", ")} -

-
- - - - diff --git a/apps/web/src/components/landing/CommandsSection.astro b/apps/web/src/components/landing/CommandsSection.astro index 3f8ac3d..1eabb0b 100644 --- a/apps/web/src/components/landing/CommandsSection.astro +++ b/apps/web/src/components/landing/CommandsSection.astro @@ -1,456 +1,91 @@ --- const commands = [ - { - command: "devmap init", - query: "how do I get started", - coreQuestion: "How do I get started?", // CONSTRUCTED - output: [ - "Provider: ✓ OpenRouter", - "API Key: ✓ Valid", - "Project: ✓ Next.js detected", - "Run: devmap analyze", - ], // REAL — condensed from docs/commands.md - }, - { - command: "devmap analyze", - query: "what is this codebase", - coreQuestion: "What is this codebase, structurally?", // CONSTRUCTED - output: [ - "PROJECT devnote", - "FRAMEWORK Next.js", - "Entry Points → app/layout.tsx", - "Critical Files → lib/auth.ts", - ], // REAL — condensed from docs/commands.md - }, - { - command: "devmap onboarding", - query: "where do I start reading", - coreQuestion: "Where should I start reading this project?", - output: [ - "Start here:", - "1. app/layout.tsx — root layout", - "2. lib/auth.ts — session handling", - "3. lib/db.ts — data access", - ], // MOCK — shape matches documented "Start here" ordered path - }, - { - command: "devmap map authentication", - query: "what does auth connect to", - coreQuestion: "This file/feature — what does it connect to, and how?", - output: [ - "auth.ts", - "├─ used by → session/route.ts", - "├─ used by → middleware.ts", - "└─ uses → db.ts", - ], // MOCK — shape matches documented dependency tree - }, - { - command: "devmap flow authentication", - query: "how does login work end to end", - coreQuestion: "How does this feature work from start to finish?", - output: [ - "1. POST /api/session", - "2. validateCredentials()", - "3. createSession()", - "4. redirect → /dashboard", - ], // MOCK — shape matches documented ordered step list - }, - { - command: 'devmap explain "authentication feature"', - query: "how does auth work", - coreQuestion: "What does this file/feature/function do, in detail?", - output: [ - "Handles session creation and validation.", - "Imports db.ts for user lookup.", - "Imported by 4 files. Marked critical.", - ], // MOCK — shape matches documented prose explanation - }, - { - command: "devmap doctor", - query: "why isn't this working", - coreQuestion: "Why isn't this working?", // CONSTRUCTED - output: [ - "DevMap version ✓", - "Provider Groq ✓", - "API key valid ✓", - "No issues found.", - ], // REAL — condensed from docs/commands.md - }, + { name: "devmap init", text: "Set up DevMap for this project and choose an AI provider if you want one." }, + { name: "devmap analyze", text: "Scan the project and write the .devmap folder. Static analysis, no AI required." }, + { name: "devmap onboarding", text: "A reading order for someone new to the codebase: where to start and what to read next." }, + { name: "devmap map", text: "Show the dependency tree from the saved analysis, without scanning again." }, + { name: "devmap flow", text: "Walk a feature or request step by step, as a Mermaid diagram or in the terminal." }, + { name: "devmap explain", text: "Ask about a file or feature and get an answer grounded in the analysis. Needs an AI provider." }, + { name: "devmap doctor", text: "Check your setup and print a report you can paste into a bug report." }, + { name: "devmap config model", text: "Pick the model used by the AI-powered commands." } ]; --- -
-
-
-
-

- Ask your codebase. The right - command answers. -

-
- -
-
- - - -
+
+

Eight commands.

-
    - {commands.map((entry, index) => ( -
  • - {entry.command} - -
  • - ))} -
- - - +
+ {commands.map((command) => ( +
+
{command.name}
+
{command.text}
-
- - - -
- {commands.map((entry) => ( -
-
{entry.query}
- {entry.command} -
- {entry.output.map((line) => ( -
{line}
- ))} -
-

{entry.coreQuestion}

-
- ))} -
-
+ ))} +
- - diff --git a/apps/web/src/components/landing/ComparisonSection.astro b/apps/web/src/components/landing/ComparisonSection.astro deleted file mode 100644 index 04665d9..0000000 --- a/apps/web/src/components/landing/ComparisonSection.astro +++ /dev/null @@ -1,182 +0,0 @@ ---- - -const metrics = [ - { metric: "How structure is found", without: "Agent infers by reading code, live", with: "Static analysis (AST), computed once" }, - { metric: "What gets sent to AI", without: "Whatever the agent decides to read", with: "Curated index + feature map, not full source" }, - { metric: "Context per session", without: "Rebuilt from scratch", with: "Cached snapshot, reused" }, - { metric: "Starting a new session", without: "No starting point", with: "Ordered reading path, with reasons" }, - { metric: "Works across AI tools", without: "Re-explained per tool", with: "One snapshot, every agent" }, -]; ---- - -
-

DevMap vs. Going in blind

- -
- - - - - - - - - - {metrics.map((row) => ( - - - - - - ))} - -
Without DevMapWith DevMap
- {row.metric} - {row.without}{row.with}
-
-
- - - - diff --git a/apps/web/src/components/landing/CopyCommand.astro b/apps/web/src/components/landing/CopyCommand.astro new file mode 100644 index 0000000..8c67db9 --- /dev/null +++ b/apps/web/src/components/landing/CopyCommand.astro @@ -0,0 +1,122 @@ +--- +interface Props { + command: string; + size?: "base" | "large"; +} + +const { command, size = "base" } = Astro.props; +--- + +
+ + + {command} + + +
+ + + + diff --git a/apps/web/src/components/landing/FeaturesSection.astro b/apps/web/src/components/landing/FeaturesSection.astro deleted file mode 100644 index 87ec289..0000000 --- a/apps/web/src/components/landing/FeaturesSection.astro +++ /dev/null @@ -1,145 +0,0 @@ ---- ---- - -
-

How it works

- -
-
-
- -

- One analyze pass builds the whole picture. - Structure, routes, dependencies, critical files — computed once - from your source code, deterministically. -

-
-
- -
-
- -

- Where a model is involved — enrichment, narration, answers — it - reads the structured snapshot instead of your raw code. AI is an - enhancement layer, not the foundation. -

-
-
-
-
- - - - diff --git a/apps/web/src/components/landing/FooterCtaSection.astro b/apps/web/src/components/landing/FooterCtaSection.astro deleted file mode 100644 index a35def6..0000000 --- a/apps/web/src/components/landing/FooterCtaSection.astro +++ /dev/null @@ -1,170 +0,0 @@ ---- ---- - - - - - - diff --git a/apps/web/src/components/landing/GetStartedSection.astro b/apps/web/src/components/landing/GetStartedSection.astro new file mode 100644 index 0000000..94b55a2 --- /dev/null +++ b/apps/web/src/components/landing/GetStartedSection.astro @@ -0,0 +1,57 @@ +--- +import CopyCommand from "./CopyCommand.astro"; +--- + +
+

Run it on the repo you have open.

+ +
+ +
+ +

+ Free and open source under the MIT license. Install it globally with{" "} + npm install -g @flaid/devmap when you want it on every project. +

+ + +
+ + diff --git a/apps/web/src/components/landing/HeroSection.astro b/apps/web/src/components/landing/HeroSection.astro index 32a5cdf..108d1de 100644 --- a/apps/web/src/components/landing/HeroSection.astro +++ b/apps/web/src/components/landing/HeroSection.astro @@ -1,283 +1,93 @@ --- - -const indexRows = [ - { - path: "lib/auth.ts", - reason: "critical · referenced by 4 files", - critical: true, - }, - { - path: "lib/db.ts", - reason: "data access layer", - critical: false, - }, - { - path: "app/api/session/route.ts", - reason: "entry point", - critical: false, - }, - { - path: "prisma/schema.prisma", - reason: "schema source", - critical: false, - }, -]; +import CopyCommand from "./CopyCommand.astro"; --- -
-
-

- Analyze once.
- Reuse context everywhere. -

- -

- DevMap analyzes your codebase once and builds a reusable context layer. - Routes, dependencies, entry points, critical files — all structured - so you stop re-explaining your project to every AI agent, every session. -

- -
- - - View on GitHub → - -
- -

- MIT licensed. No account or API key required to start. -

- -
-
- devmap analyze -
- -
- {indexRows.map((row) => ( -
-
- - -
-
-
{row.path}
-
{row.reason}
-
-
- ))} -
- -

- One snapshot. Reused by every question after this. -

-
+
+

+ Analyze once. + Reuse context + everywhere. +

+ +

+ DevMap reads your codebase and writes a map that developers and AI agents + can start from: entry points, critical files, features and routes. +

+ + -
- - +

Needs Node 22 or newer. No account or API key to analyze.

+
diff --git a/apps/web/src/components/landing/MethodSection.astro b/apps/web/src/components/landing/MethodSection.astro new file mode 100644 index 0000000..8c652f2 --- /dev/null +++ b/apps/web/src/components/landing/MethodSection.astro @@ -0,0 +1,161 @@ +--- +const steps = [ + "Scan files", + "Analyze files", + "Build the dependency graph", + "Detect the framework", + "Detect routes", + "Detect the database", + "Extract entities", + "Detect capabilities", + "Detect features", + "Infer the domain", + "Rank critical files", + "Generate flows" +]; +const optionalAi = "Infer the domain"; + +const frameworks = ["Next.js", "Astro", "Nuxt", "SvelteKit", "Express", "Fastify", "NestJS"]; +--- + +
+
+

+ The same code gives the same map. +

+

+ Files, imports, routes, features and flows come from static analysis, so + the result doesn't change between runs. AI is optional and is used in + three places: inferring what the project is for, describing files, and + answering questions. If the provider fails, devmap analyze{" "} + still finishes. +

+
+ +
    + {steps.map((step) => ( +
  1. + {step} + {step === optionalAi && (optional AI)} +
  2. + ))} +
+ +
+
+

Routes mapped for

+

{frameworks.join(", ")}.

+
+
+

Read with full syntax trees

+

TypeScript, JavaScript, Vue, Svelte and Astro.

+
+
+

Read with pattern matching

+

Python, PHP, Go, Ruby, C# and Java: imports, exports and declarations.

+
+
+
+ + diff --git a/apps/web/src/components/landing/OnboardingSection.astro b/apps/web/src/components/landing/OnboardingSection.astro deleted file mode 100644 index 8f9ffb2..0000000 --- a/apps/web/src/components/landing/OnboardingSection.astro +++ /dev/null @@ -1,125 +0,0 @@ ---- - -const outputItems = [ - "Recommended reading path with entry points and critical files", - "Feature map — which files own which features", - "Key flows and how features connect end to end", - "Available commands to go deeper after onboarding", -]; ---- - -
-

- New to a codebase? Know where to start. -

- -

- devmap onboarding answers the one question every developer asks when - joining an unfamiliar project: -

- -

"Where do I even begin?"

- -
- {outputItems.map((item) => ( -
- -

{item}

-
- ))} -
-
- - - - diff --git a/apps/web/src/components/landing/OpenSourceSection.astro b/apps/web/src/components/landing/OpenSourceSection.astro deleted file mode 100644 index 202047f..0000000 --- a/apps/web/src/components/landing/OpenSourceSection.astro +++ /dev/null @@ -1,111 +0,0 @@ ---- - -const supportLinks = [ - { label: "Ko-fi", href: "https://ko-fi.com/itsflaid" }, - { label: "GitHub Sponsors", href: "https://github.com/sponsors/itsflaid" }, -]; ---- - -
-
-

Free. Open Source. Forever.

- -

- DevMap is MIT licensed and free to use. No subscription. No account - required. No DevMap servers involved. -

- -

- If DevMap saves you time, consider supporting development. -

- - -
-
- - - - diff --git a/apps/web/src/components/landing/OutputSection.astro b/apps/web/src/components/landing/OutputSection.astro new file mode 100644 index 0000000..f85c68f --- /dev/null +++ b/apps/web/src/components/landing/OutputSection.astro @@ -0,0 +1,178 @@ +--- +// Excerpt of the .devmap/index.json that `devmap analyze` wrote for this +// repository. Lines marked `hot` are the ones an agent reads first. +const lines: Array<{ text: string; hot?: boolean }> = [ + { text: "{" }, + { text: ' "project": {' }, + { text: ' "name": "devmap-workspace",' }, + { text: ' "framework": "astro",' }, + { text: ' "language": "typescript",' }, + { text: ' "workspaceType": "monorepo"' }, + { text: " }," }, + { text: ' "entryPoints": [', hot: true }, + { text: ' "packages/cli/src/index.ts",', hot: true }, + { text: ' "apps/web/src/pages/docs.astro",', hot: true }, + { text: ' "apps/web/src/pages/index.astro"', hot: true }, + { text: " ]," , hot: true }, + { text: ' "criticalFiles": [' }, + { text: ' "packages/cli/src/commands/analyze.ts",' }, + { text: ' "packages/cli/src/commands/init.ts",' }, + { text: ' "packages/cli/src/commands/map.ts"' }, + { text: " ]," }, + { text: ' "features": [' }, + { text: " {" }, + { text: ' "name": "CLI Commands",' }, + { text: ' "map": ".devmap/features/cli-commands.json"' }, + { text: " }" }, + { text: " ]" }, + { text: "}" } +]; + +const files = [ + { name: "index.json", note: "Start here. Entry points, critical files and a pointer to each feature." }, + { name: "features/*.json", note: "One map per feature, with the files that implement it." }, + { name: "snapshot.json", note: "The full analysis, read only when the two above are not enough." } +]; +--- + +
+
+

+ Your project, as files an agent can read. +

+

+ devmap analyze writes a .devmap folder next to + your code. Agents open the small index first and follow it to the one + feature they need, instead of exploring the whole repository. +

+ +
+ {files.map((file) => ( +
+
.devmap/{file.name}
+
{file.note}
+
+ ))} +
+
+ +
+
+ .devmap/index.json, trimmed, from analyzing this repository. + The highlighted lines are the entry points. +
+
{lines.map((line) => (
+      {line.text}
+    ))}
+
+
+ + diff --git a/apps/web/src/components/landing/ProblemSection.astro b/apps/web/src/components/landing/ProblemSection.astro index 4efbb53..ad40d1e 100644 --- a/apps/web/src/components/landing/ProblemSection.astro +++ b/apps/web/src/components/landing/ProblemSection.astro @@ -1,116 +1,28 @@ ---- - -const painPoints = [ - { - number: "01", - text: "You point your AI agent at an unfamiliar codebase.", - }, - { - number: "02", - text: "It reads dozens of files trying to piece the architecture together, burning tokens and time.", - }, - { - number: "03", - text: "It still gets it wrong, and starts over from zero next session.", - }, -]; ---- - -
-

- Modern AI writes code faster than you can understand it. +
+

+ Every new session, every new agent and every new teammate starts the same + way: open files, trace imports, guess which ones matter.{" "} + + The code didn't change. The understanding gets rebuilt anyway. +

- -
- {painPoints.map((point) => ( -
- {point.number} -

{point.text}

-
- ))} -
- -

- devmap fixes this: analyze once, reuse the map every session after. -

- - diff --git a/apps/web/src/components/landing/SiteFooter.astro b/apps/web/src/components/landing/SiteFooter.astro index 9b94797..105f867 100644 --- a/apps/web/src/components/landing/SiteFooter.astro +++ b/apps/web/src/components/landing/SiteFooter.astro @@ -1,132 +1,26 @@ ---- - -const footerLinks = [ - { label: "GitHub", href: "https://github.com/itsflaid/devmap" }, - { label: "Documentation", href: "https://github.com/itsflaid/devmap#readme" }, -]; ---- - -