Skip to content

Commit 6f4dfd1

Browse files
authored
Merge pull request #47 from btravstack/codex/refresh-project-brand
feat: introduce framework-first website and illustrated logo family
2 parents acf6e2d + caca8c0 commit 6f4dfd1

61 files changed

Lines changed: 1053 additions & 673 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@btravstack/theme": patch
3+
---
4+
5+
Refresh the shared ecosystem attribution mark to match the coordinated beetroot logo family.

‎.hallmark/log.json‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,13 @@
11
[
2+
{
3+
"date": "2026-10-07",
4+
"scope": "app",
5+
"macrostructure": "Ecosystem Index (framework first)",
6+
"theme": "Beetroot Stack",
7+
"brief": "Framework-first homepage, corrected DI links, illustrated SVG mascots preserving the approved beetroot artwork and project motifs, refreshed social previews",
8+
"nav": "N1b",
9+
"footer": "Ft3 index"
10+
},
211
{
312
"date": "2026-07-16",
413
"macrostructure": "Ecosystem Index (extended)",
@@ -54,4 +63,4 @@
5463
"footer": "Ft4 dense colophon",
5564
"brief": "btravstack org rebrand v1 \u2014 Beetroot Riso (REJECTED by user; PR #27)"
5665
}
57-
]
66+
]

‎README.md‎

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pnpm build # builds the theme, then the website
1818
## How it fits together
1919

2020
- **`@btravstack/theme`** wraps VitePress's default theme with the btravstack
21-
design tokens (beetroot brand, Montserrat + JetBrains Mono, light/dark
21+
design tokens (beetroot brand, Geist + JetBrains Mono, light/dark
2222
surfaces). Every btravstack site — this website and the `amqp-contract` /
2323
`temporal-contract` / `unthrown` docs — depends on it, so they all share one
2424
look. It's built with `tsdown` and published to npm via `.github/workflows/release.yml`
@@ -31,3 +31,27 @@ pnpm build # builds the theme, then the website
3131
Add a changeset (`pnpm changeset`), merge to `main`; the Release workflow opens
3232
a version PR and, when merged, publishes `@btravstack/theme`. Consumers bump the
3333
dependency to adopt it.
34+
35+
## Website and framework
36+
37+
The domain root introduces the ecosystem, with the btravstack framework as
38+
its main entry point. Framework tutorials and reference stay at
39+
[/btravstack/](https://btravstack.github.io/btravstack/); independently usable
40+
libraries keep their own documentation URLs.
41+
42+
## Brand assets
43+
44+
The illustrated family keeps the approved smiling beetroot, soft shading, and
45+
each project’s original motif. The exact approved framework PNG is retained at
46+
`apps/website/public/logos/framework.png` alongside its native SVG redrawing.
47+
48+
Run `pnpm brand` to regenerate the SVG family in `apps/website/public/logos`
49+
and the shared theme's attribution mark. The source and palette live in
50+
`scripts/generate-brand.mjs`; usage is documented in [design.md](design.md).
51+
52+
[The logo proof sheet](branding/logo-family.png) shows light/dark variants and
53+
small sizes. The editable [social card](branding/social-card.html) accepts
54+
`?project=btravstack` (or `framework`, `unthrown`, `entity`, `amqp-contract`,
55+
`temporal-contract`, `tools`, `theme`). Render at 1200 × 630 with device scale
56+
factor 1 after its fonts and images load. Exports live under
57+
`apps/website/public/og-*.png`; project repositories carry local copies.

‎apps/website/.vitepress/config.ts‎

Lines changed: 22 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import { defineConfig } from "vitepress";
2+
import { documentedProjects } from "./projects";
23

34
const SITE_TITLE = "BtravStack";
45
const SITE_DESCRIPTION =
5-
"Type-safe building blocks for the TypeScript backend: contracts for AMQP & Temporal, typed dependency injection, and errors as values.";
6+
"A TypeScript backend framework and focused libraries for typed errors, domain entities, dependency injection, AMQP and Temporal.";
67
const SITE_URL = "https://btravstack.github.io";
78

89
// https://vitepress.dev/reference/site-config
910
export default defineConfig({
1011
title: SITE_TITLE,
11-
titleTemplate: "An expressive, robust TypeScript backend",
12+
titleTemplate: "A backend that fits together",
1213
description: SITE_DESCRIPTION,
1314
lang: "en-US",
1415
// user/org site (btravstack.github.io) is served from the domain root
@@ -35,13 +36,13 @@ export default defineConfig({
3536
["meta", { property: "og:type", content: "website" }],
3637
["meta", { property: "og:site_name", content: SITE_TITLE }],
3738
["meta", { property: "og:locale", content: "en_US" }],
38-
["meta", { property: "og:title", content: `${SITE_TITLE} — an expressive, robust TypeScript backend` }],
39+
["meta", { property: "og:title", content: `${SITE_TITLE} — a backend that fits together` }],
3940
["meta", { property: "og:description", content: SITE_DESCRIPTION }],
4041
["meta", { property: "og:url", content: `${SITE_URL}/` }],
4142
["meta", { property: "og:image", content: `${SITE_URL}/og-btravstack.png` }],
4243
["meta", { property: "og:image:type", content: "image/png" }],
43-
["meta", { property: "og:image:width", content: "1280" }],
44-
["meta", { property: "og:image:height", content: "640" }],
44+
["meta", { property: "og:image:width", content: "1200" }],
45+
["meta", { property: "og:image:height", content: "630" }],
4546
[
4647
"meta",
4748
{
@@ -52,7 +53,7 @@ export default defineConfig({
5253

5354
// Twitter Card
5455
["meta", { name: "twitter:card", content: "summary_large_image" }],
55-
["meta", { name: "twitter:title", content: `${SITE_TITLE} — an expressive, robust TypeScript backend` }],
56+
["meta", { name: "twitter:title", content: `${SITE_TITLE} — a backend that fits together` }],
5657
["meta", { name: "twitter:description", content: SITE_DESCRIPTION }],
5758
["meta", { name: "twitter:image", content: `${SITE_URL}/og-btravstack.png` }],
5859
[
@@ -63,7 +64,7 @@ export default defineConfig({
6364
},
6465
],
6566

66-
// JSON-LD: the org, the site, and the three packages it publishes
67+
// Organization and project metadata share the visible project index.
6768
[
6869
"script",
6970
{ type: "application/ld+json" },
@@ -95,59 +96,30 @@ export default defineConfig({
9596
"@context": "https://schema.org",
9697
"@type": "ItemList",
9798
name: "BtravStack packages",
98-
itemListElement: [
99-
{
100-
"@type": "ListItem",
101-
position: 1,
102-
item: {
103-
"@type": "SoftwareApplication",
104-
name: "amqp-contract",
105-
applicationCategory: "DeveloperApplication",
106-
operatingSystem: "Cross-platform",
107-
url: "https://btravstack.github.io/amqp-contract/",
108-
description: "Type-safe contracts for AMQP & RabbitMQ.",
109-
},
99+
itemListElement: documentedProjects.map((project, index) => ({
100+
"@type": "ListItem",
101+
position: index + 1,
102+
item: {
103+
"@type": "SoftwareApplication",
104+
name: project.name,
105+
applicationCategory: "DeveloperApplication",
106+
operatingSystem: "Cross-platform",
107+
url: project.docs,
108+
description: project.blurb,
110109
},
111-
{
112-
"@type": "ListItem",
113-
position: 2,
114-
item: {
115-
"@type": "SoftwareApplication",
116-
name: "temporal-contract",
117-
applicationCategory: "DeveloperApplication",
118-
operatingSystem: "Cross-platform",
119-
url: "https://btravstack.github.io/temporal-contract/",
120-
description: "Type-safe contracts for Temporal.io.",
121-
},
122-
},
123-
{
124-
"@type": "ListItem",
125-
position: 3,
126-
item: {
127-
"@type": "SoftwareApplication",
128-
name: "unthrown",
129-
applicationCategory: "DeveloperApplication",
130-
operatingSystem: "Cross-platform",
131-
url: "https://btravstack.github.io/unthrown/",
132-
description: "Explicit errors as values, for TypeScript.",
133-
},
134-
},
135-
],
110+
})),
136111
}),
137112
],
138113
],
139114

140115
themeConfig: {
141116
logo: { light: "/logos/btravstack-light.svg", dark: "/logos/btravstack-dark.svg" },
142117
nav: [
143-
{ text: "Packages", link: "/#packages" },
118+
{ text: "Framework", link: "/#framework" },
119+
{ text: "Libraries", link: "/#packages" },
144120
{
145121
text: "Docs",
146-
items: [
147-
{ text: "amqp-contract", link: "https://btravstack.github.io/amqp-contract/" },
148-
{ text: "temporal-contract", link: "https://btravstack.github.io/temporal-contract/" },
149-
{ text: "unthrown", link: "https://btravstack.github.io/unthrown/" },
150-
],
122+
items: documentedProjects.map((project) => ({ text: project.name, link: project.docs })),
151123
},
152124
],
153125
socialLinks: [{ icon: "github", link: "https://github.com/btravstack" }],
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
export const framework = {
2+
name: "btravstack",
3+
docs: "https://btravstack.github.io/btravstack/",
4+
tutorial: "https://btravstack.github.io/btravstack/tutorial/getting-started",
5+
repo: "https://github.com/btravstack/btravstack",
6+
blurb: "A TypeScript application kernel and starters for HTTP, Temporal and AMQP, with typed wiring and graceful shutdown.",
7+
};
8+
9+
export const projects = [
10+
{
11+
key: "unthrown", tag: "Errors", name: "unthrown", pkg: "unthrown",
12+
logo: "/logos/unthrown",
13+
blurb: "Expected failures in the return type. A separate defect channel keeps unexpected failures visible without mixing them into your application errors.",
14+
points: ["Errors as values, typed in E", "A separate defect channel", "Zero runtime dependencies"],
15+
install: "pnpm add unthrown",
16+
repo: "https://github.com/btravstack/unthrown", docs: "https://btravstack.github.io/unthrown/",
17+
},
18+
{
19+
key: "entity", tag: "Domain", name: "entity", pkg: "@btravstack/entity",
20+
logo: "/logos/entity",
21+
blurb: "Declare your domain once. Derive types and request/response schemas from a field map, with sealed construction and behavior that stays with the entity.",
22+
points: ["Branded fields and immutable data", "Sealed construction, enforced invariants", "Result instead of throws"],
23+
install: "pnpm add @btravstack/entity",
24+
repo: "https://github.com/btravstack/btravstack/tree/main/packages/entity", docs: "https://btravstack.github.io/btravstack/entity/",
25+
},
26+
{
27+
key: "di", tag: "Wiring", name: "di", pkg: "@btravstack/di",
28+
logo: "/logos/di",
29+
blurb: "Declare ports, bind providers, compose modules. Check the wiring before the process starts and keep implementation details private. Part of the framework; usable on its own.",
30+
points: ["Ports named by the domain, not the adapter", "Unmet dependencies are compile errors", "Scoped resources release themselves"],
31+
install: "pnpm add @btravstack/di unthrown",
32+
repo: "https://github.com/btravstack/btravstack/tree/main/packages/di", docs: "https://btravstack.github.io/btravstack/reference/di/",
33+
},
34+
{
35+
key: "amqp", tag: "Messaging", name: "amqp-contract", pkg: "@amqp-contract/contract",
36+
logo: "/logos/amqp-contract",
37+
blurb: "Type-safe contracts for AMQP & RabbitMQ. Define your exchanges, queues and messages once — get types and runtime validation on both ends.",
38+
points: ["End-to-end type safety", "Reliable retry with Dead Letter Queues", "AsyncAPI 3.0 generation"],
39+
install: "pnpm add @amqp-contract/contract",
40+
repo: "https://github.com/btravstack/amqp-contract", docs: "https://btravstack.github.io/amqp-contract/",
41+
},
42+
{
43+
key: "temporal", tag: "Workflows", name: "temporal-contract", pkg: "@temporal-contract/contract",
44+
logo: "/logos/temporal-contract",
45+
blurb: "Type-safe contracts for Temporal.io. End-to-end types and automatic validation across workflows, activities and clients.",
46+
points: ["Zod validation at every boundary", "Compile-time implementation checks", "Result / Future error handling"],
47+
install: "pnpm add @temporal-contract/contract",
48+
repo: "https://github.com/btravstack/temporal-contract", docs: "https://btravstack.github.io/temporal-contract/",
49+
},
50+
];
51+
52+
export const tooling = [
53+
{ name: "tools", logo: "/logos/tools", description: "Shared configs and workflows for building and shipping TypeScript.", repo: "https://github.com/btravstack/tools" },
54+
{ name: "@btravstack/theme", logo: "/logos/theme", description: "The VitePress theme and design tokens behind these docs.", repo: "https://github.com/btravstack/btravstack.github.io/tree/main/packages/theme" },
55+
];
56+
57+
export const documentedProjects = [framework, ...projects];

0 commit comments

Comments
 (0)