Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .release-please-manifest.develop.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
".": "0.1.0-alpha.3",
"apps/web": "0.1.0-alpha.3",
".": "0.1.0-alpha.4",
"apps/web": "0.1.0-alpha.4",
"apps/worker": "0.1.0-alpha.2"
}
14 changes: 14 additions & 0 deletions CHANGELOG-DEVELOP.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## [0.1.0-alpha.4](https://github.com/devakone/vibe-coding-profiler/compare/vibed-coding-v0.1.0-alpha.3...vibed-coding-v0.1.0-alpha.4) (2026-01-22)


### Features

* **web:** add agents.txt and robots.txt files, update branding to "Vibe Coding Profiler" ([0afc2c8](https://github.com/devakone/vibe-coding-profiler/commit/0afc2c864b9b1a7fce79d7d5fddbf60c2a7a2490))
* **web:** add new aura backgrounds and update persona aura structure ([3590f97](https://github.com/devakone/vibe-coding-profiler/commit/3590f97b9690ff59feb3f50b38de23d06b6be1c1))
* **web:** enhance Open Graph metadata and add dynamic OG image generation ([6b68e45](https://github.com/devakone/vibe-coding-profiler/commit/6b68e455263114fd4fb2a37bb7335270c612fdca))


### Bug Fixes

* **web:** update branding from "vibed.app" to "vibe-coding-profiler.com" ([852cfc5](https://github.com/devakone/vibe-coding-profiler/commit/852cfc511c21b1c40ba29a310668d7686e9af533))

## [0.1.0-alpha.3](https://github.com/devakone/vibe-coding-profile/compare/vibed-coding-v0.1.0-alpha.2...vibed-coding-v0.1.0-alpha.3) (2026-01-22)


Expand Down
14 changes: 14 additions & 0 deletions apps/web/CHANGELOG-DEVELOP.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,19 @@
# Changelog

## [0.1.0-alpha.4](https://github.com/devakone/vibe-coding-profiler/compare/web-v0.1.0-alpha.3...web-v0.1.0-alpha.4) (2026-01-22)


### Features

* **web:** add agents.txt and robots.txt files, update branding to "Vibe Coding Profiler" ([0afc2c8](https://github.com/devakone/vibe-coding-profiler/commit/0afc2c864b9b1a7fce79d7d5fddbf60c2a7a2490))
* **web:** add new aura backgrounds and update persona aura structure ([3590f97](https://github.com/devakone/vibe-coding-profiler/commit/3590f97b9690ff59feb3f50b38de23d06b6be1c1))
* **web:** enhance Open Graph metadata and add dynamic OG image generation ([6b68e45](https://github.com/devakone/vibe-coding-profiler/commit/6b68e455263114fd4fb2a37bb7335270c612fdca))


### Bug Fixes

* **web:** update branding from "vibed.app" to "vibe-coding-profiler.com" ([852cfc5](https://github.com/devakone/vibe-coding-profiler/commit/852cfc511c21b1c40ba29a310668d7686e9af533))

## [0.1.0-alpha.3](https://github.com/devakone/vibe-coding-profile/compare/web-v0.1.0-alpha.2...web-v0.1.0-alpha.3) (2026-01-22)


Expand Down
5 changes: 4 additions & 1 deletion apps/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
"build": "next build",
"start": "next start -p 8108",
"lint": "eslint",
"type-check": "tsc --noEmit"
"type-check": "tsc --noEmit",
"test": "vitest run",
"test:watch": "vitest"
},
"dependencies": {
"@radix-ui/react-popover": "^1.1.15",
Expand All @@ -32,6 +34,7 @@
"devDependencies": {
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"vitest": "^1",
"@types/qrcode": "^1.5.6",
"@types/react": "^19",
"@types/react-dom": "^19",
Expand Down
27 changes: 27 additions & 0 deletions apps/web/public/agents.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Vibe Coding Profiler - agents.txt
# Instructions for AI agents and LLM crawlers
# https://vibed.dev

# About this site
name: Vibe Coding Profiler
description: Vibe Coding Profiler analyzes git commit history to reveal your unique Vibe Coding Profile (VCP) β€” your AI-era coding persona with patterns, insights, and shareable profiles grounded in commit evidence.
url: https://vibed.dev

# What we do
purpose: We help developers understand their coding style in the AI era by analyzing commit patterns, detecting AI-assisted workflows, and generating shareable "Vibe Coding Profiles" that reveal how developers collaborate with AI tools.

# Key concepts
- VCP (Vibe Coding Profile): A persona-based profile showing your coding patterns
- Vibe Axes: Six dimensions measuring coding style (shipping rhythm, context window, AI reliance, scope approach, feedback loop, collaboration style)
- Personas: Archetypes like "Prompt Sprinter", "Guardrailed Viber", "Methodical Architect" that represent different AI-era coding styles

# For AI agents
contact: https://github.com/devakone/vibed-coding
license: Proprietary (open-sourcing planned)

# Crawling preferences
User-agent: *
Allow: /
Disallow: /api/
Disallow: /settings/
Disallow: /admin/
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
13 changes: 13 additions & 0 deletions apps/web/public/robots.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Vibe Coding Profiler - robots.txt
# https://vibed.dev

User-agent: *
Allow: /

# Disallow private/authenticated routes
Disallow: /api/
Disallow: /settings/
Disallow: /admin/

# Sitemap
Sitemap: https://vibed.dev/sitemap.xml
2 changes: 1 addition & 1 deletion apps/web/src/app/AppHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ export default function AppHeader(props: {
>
<span className={wrappedTheme.dot} />
<span className="text-lg font-bold tracking-tight text-zinc-950">
Vibe Coding Profile
Vibe Coding Profiler
</span>
</Link>
<nav className="flex items-center gap-1 text-sm">
Expand Down
114 changes: 114 additions & 0 deletions apps/web/src/app/analysis/[jobId]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,124 @@
import type { Metadata } from "next";
import AnalysisClient from "./AnalysisClient";
import { createSupabaseServerClient } from "@/lib/supabase/server";
import { redirect } from "next/navigation";
import { wrappedTheme } from "@/lib/theme";

export const runtime = "nodejs";

const appUrl = process.env.NEXT_PUBLIC_APP_URL ?? "http://localhost:8108";

// Database row types for OG metadata
type AnalysisJobRow = {
repo_id: string;
commit_count: number | null;
status: string;
};

type RepoRow = {
full_name: string;
};

type VibeInsightsRow = {
persona_name: string | null;
persona_tagline: string | null;
};

type AnalysisInsightsRow = {
persona_label: string | null;
share_template: unknown;
};

export async function generateMetadata({
params,
}: {
params: Promise<{ jobId: string }>;
}): Promise<Metadata> {
const { jobId } = await params;
const supabase = await createSupabaseServerClient();

// Fetch job and related data for OG metadata
const { data: jobData } = await supabase
.from("analysis_jobs")
.select("repo_id, commit_count, status")
.eq("id", jobId)
.maybeSingle();

const job = jobData as AnalysisJobRow | null;

if (!job || job.status !== "done") {
return {
title: "Analysis | Vibe Coding Profiler",
description: "Analyzing your commit history to discover your Vibe Coding Profile.",
};
}

// Fetch persona and repo info
const [repoResult, vibeResult, insightsResult] = await Promise.all([
supabase.from("repos").select("full_name").eq("id", job.repo_id).maybeSingle(),
supabase
.from("vibe_insights")
.select("persona_name, persona_tagline")
.eq("job_id", jobId)
.maybeSingle(),
supabase
.from("analysis_insights")
.select("persona_label, share_template")
.eq("job_id", jobId)
.maybeSingle(),
]);

const repoRow = repoResult?.data as RepoRow | null;
const vibeRow = vibeResult?.data as VibeInsightsRow | null;
const insightsRow = insightsResult?.data as AnalysisInsightsRow | null;

const repoName =
repoRow?.full_name && typeof repoRow.full_name === "string"
? repoRow.full_name
: "Repository";

const personaName =
vibeRow?.persona_name ??
insightsRow?.persona_label ??
"Vibe Coder";

const personaTagline =
vibeRow?.persona_tagline ??
(insightsRow?.share_template as { tagline?: string } | null)?.tagline ??
"Discover your AI coding style";

const title = `${personaName} | ${repoName} VCP`;
const description = `${personaTagline} β€” ${job.commit_count?.toLocaleString() ?? 0} commits analyzed.`;
const ogImageUrl = `${appUrl}/api/og/analysis/${jobId}`;
const pageUrl = `${appUrl}/analysis/${jobId}`;

return {
title,
description,
openGraph: {
title,
description,
url: pageUrl,
siteName: "Vibe Coding Profiler",
type: "article",
images: [
{
url: ogImageUrl,
width: 1200,
height: 630,
alt: `${personaName} - Vibe Coding Profile for ${repoName}`,
},
],
},
twitter: {
card: "summary_large_image",
title,
description,
images: [ogImageUrl],
},
};
}

export default async function AnalysisPage({
params,
}: {
Expand Down
Loading
Loading