Official Homepage, Documentation, and Developer Wiki for BlankOn Linux — an Indonesian Linux distribution based on Debian.
Teras (Indonesian for "porch/terrace") serves as the central hub for showcasing BlankOn, providing user documentation, and hosting developer guides.
- React 19 + TanStack Start/Router — Full-stack React with SSR
- Fumadocs — Documentation framework with MDX support
- Tailwind CSS v4 — Styling with shadcn/ui components
- Cloudflare Workers — Edge deployment
npm install
npm run dev # Start dev server on port 3000| Command | Description |
|---|---|
npm run dev |
Start development server |
npm run sync-wiki |
Clone revival repo and sync wiki content |
npm run build |
Build for production (auto-syncs wiki first) |
npm run test |
Run tests (Vitest) |
npm run lint |
Run ESLint |
npm run check |
Format with Prettier and fix linting |
npm run deploy |
Deploy to Cloudflare Workers |
teras/
├── content/ # MDX documentation content
│ └── wiki/ # Wiki content (auto-generated from revival repo)
├── public/ # Static assets
│ └── wiki/assets/ # Wiki assets (auto-copied from revival repo)
├── scripts/ # Build and utility scripts
│ └── sync-wiki.mjs # Script to sync wiki from revival repo
├── src/
│ ├── lib/ # Utilities, i18n, content sources
│ └── routes/ # TanStack Router file-based routes
├── openspec/ # Specifications and change proposals
└── AGENTS.md # AI assistant instructions
The wiki content is automatically generated from the BlankOn revival repository.
- Content is cloned from
https://github.com/blankon/revival - Markdown files (
.md) are converted to MDX (.mdx) with frontmatter - Assets are copied to
public/wiki/assets/ - The
sync-wikiscript runs automatically before each build (prebuildhook)
To manually sync wiki content:
npm run sync-wiki- Default: English (
en) - Supported: English, Indonesian (
id) - URL structure:
/{lang}/path(e.g.,/en/wiki,/id/wiki)
Content files use suffix convention:
index.mdx— English (default)index.id.mdx— Indonesian
This project enforces consistent code style via Prettier and ESLint:
- No semicolons — Omit semicolons at end of statements
- Single quotes — Use
'single quotes'for strings - Trailing commas — Always include trailing commas in multiline structures
- Strict TypeScript — No unused locals/parameters, strict mode enabled
- Path aliases — Use
@/*for./src/*imports
Naming conventions:
| Type | Convention | Example |
|---|---|---|
| Components | PascalCase | DownloadPage, SearchBar |
| Functions/variables | camelCase | getUserData, isLoading |
| Route parameters | $prefix | $lang, $.tsx (splat) |
Import order:
- External packages (
react,@tanstack/*,fumadocs-*) - Internal imports using
@/alias
Run npm run check before committing.
Use Conventional Commits format:
<type>: <description>
| Type | Purpose |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation changes |
style |
Code style (formatting, no logic change) |
refactor |
Code refactoring (no feature/fix) |
test |
Adding or updating tests |
chore |
Maintenance tasks, dependencies, configs |
Examples:
feat: add download page with ISO links
fix: resolve search API language detection
docs: update installation guide for BlankOn 16
chore: update fumadocs dependencies
- Fork and clone the repository
- Create a feature branch
- Make changes and run
npm run check - Submit a pull request
This project uses OpenSpec for spec-driven development. AI assistants (Claude, Copilot, Cursor, etc.) must follow these guidelines:
| File | Purpose |
|---|---|
AGENTS.md |
Build commands, code style, git conventions |
openspec/AGENTS.md |
Spec-driven development workflow |
openspec/project.md |
Project context and conventions |
Create an OpenSpec proposal (openspec/changes/[change-id]/) for:
- New features or capabilities
- Breaking changes (API, schema, architecture)
- Performance or security changes that affect behavior
Proceed directly for:
- Bug fixes restoring intended behavior
- Typos, formatting, comments
- Non-breaking dependency updates
- Configuration changes
- Tests for existing behavior
- Create — Scaffold proposal with
proposal.md,tasks.md, and spec deltas - Implement — Follow
tasks.mdchecklist after approval - Archive — Move to
changes/archive/after deployment
# Validate a change proposal
openspec validate [change-id] --strict
# List active changes
openspec list
# List specifications
openspec list --specsSee openspec/AGENTS.md for complete instructions.
MIT License — see LICENSE for details.