Kaneo Coding Standards: Formatting, TypeScript, and Git Conventions Explained
Kaneo maintains strict coding standards through automated tooling, requiring Biome-formatted TypeScript with specific import ordering, Conventional Commits for Git history, and mandatory pre-commit hooks that run linting and full builds across the monorepo.
The usekaneo/kaneo repository follows a comprehensive set of coding standards designed to keep its monorepo architecture consistent across backend and frontend packages. These coding standards for Kaneo are documented in CLAUDE.md and CONTRIBUTING.md, with enforcement handled automatically by Biome, Husky, and CI pipelines to ensure every contribution meets quality benchmarks before reaching production.
Code Formatting with Biome
All source code must adhere to the formatting rules defined in biome.json at the repository root. The configuration enforces spaces for indentation, double-quoted strings, and required semicolons at statement endings. CSS files and package.json are explicitly excluded from linting to avoid conflicts with package management and styling workflows.
To check formatting manually, run:
pnpm lint
Biome automatically fixes violations during the pre-commit phase, ensuring that only compliant code enters the Git history.
TypeScript Conventions and Naming
The codebase follows opinionated TypeScript patterns that prioritize type safety and readability. Developers should prefer type over interface unless specifically extending or merging declarations, and rely on type inference when the type is obvious from context.
File naming follows distinct casing rules based on content type:
- PascalCase for React components (e.g.,
TaskItem.tsx) - kebab-case for utility functions and hooks (e.g.,
use-task.ts) - Hooks must start with
useto comply with React conventions
Import Organization Rules
Imports must follow a strict three-tier hierarchy enforced by Biome's auto-organize feature:
- External packages (e.g.,
react,hono) - Internal packages using
@/aliases (e.g.,@/components/ui/card) - Relative imports (e.g.,
./task-item.css)
This ordering separates third-party dependencies from internal modules and local assets. The following example from apps/web demonstrates the correct structure:
import { useTranslation } from "react-i18next"; // 1️⃣ external
import { Card } from "@/components/ui/card"; // 2️⃣ internal alias
import "./task-item.css"; // 3️⃣ relative
export default function TaskItem({ id }: { id: string }) {
const { t } = useTranslation();
return (
<Card className="task-item">
<h3>{t("tasks:labels.title")}</h3>
</Card>
);
}
Git Standards and Conventional Commits
All commit messages must follow the Conventional Commit format using prefixes such as feat:, fix:, docs:, refactor:, test:, and chore:. This standardization enables automated changelog generation and semantic versioning.
The enforcement mechanism resides in .husky/commit-msg, which runs commitlint against every commit message. An example of a compliant commit message:
feat: add bulk delete endpoint for tasks
- New POST /tasks/bulk-delete route
- Validation via Valibot schema
- Updated OpenAPI docs
Pre-Commit Validation Pipeline
The .husky/pre-commit hook executes a strict validation pipeline that blocks non-compliant code. Before any commit completes, the system runs:
biome ci .to lint and format all staged filespnpm run buildto verify the entire monorepo compiles without errors
This dual-check ensures that neither formatting violations nor build-breaking changes reach the repository.
Monorepo Structure Standards
Kaneo organizes code into a strict directory hierarchy:
apps/api/– Backend Hono/Node.js applicationapps/web/– Frontend React + Vite applicationpackages/– Shared code consumed by both applications
Within these boundaries, backend code follows a pattern of routes, controllers, and fetchers. For example, controllers in apps/api/src/ use PascalCase filenames and import database utilities via @/ aliases:
import { db } from "@/database";
import { taskTable } from "@/database/schema";
import { eq } from "drizzle-orm";
export async function getTask(taskId: string) {
const [task] = await db.select().from(taskTable).where(eq(taskTable.id, taskId));
return task;
}
Testing and Localization Requirements
The codebase requires passing tests before merge, executed via:
pnpm test– Unit testspnpm test:integration– API integration tests
These commands run in the CI pipeline defined in .github/workflows/ci.yml.
For internationalization, all UI strings must reside in i18n/ JSON files using dot-separated, namespaced keys (e.g., "tasks:labels.title"). The repository provides helper scripts to validate translations:
pnpm i18n:check– Verify translation consistencypnpm i18n:report– Generate translation coverage reports
Summary
- Formatting: Biome enforces spaces, double quotes, and semicolons via
biome.jsonandpnpm lint - TypeScript: Prefer
typeoverinterface; use PascalCase for components and kebab-case for utilities - Imports: Strict three-tier order (external → internal
@/→ relative) auto-organized by Biome - Git: Conventional Commits required, enforced by
.husky/commit-msg - Pre-commit:
.husky/pre-commitrunsbiome ci .and full monorepo builds - Structure: Backend in
apps/api/, frontend inapps/web/, shared code inpackages/ - Quality: Tests via
pnpm testandpnpm test:integration; i18n strings in namespaced JSON files
Frequently Asked Questions
What formatter does Kaneo use for code standards?
Kaneo uses Biome as its formatter and linter, configured in biome.json. It handles import sorting, indentation, quote style, and semicolon enforcement. Developers trigger formatting manually with pnpm lint or automatically via the pre-commit hook.
How should I name React components in Kaneo?
React components must use PascalCase filenames (e.g., TaskItem.tsx) and be stored in the appropriate apps/web/src/ directory. Custom hooks must begin with the use prefix and typically use kebab-case filenames (e.g., use-task.ts).
What commit message format does Kaneo require?
Kaneo requires Conventional Commits with specific type prefixes including feat:, fix:, docs:, refactor:, test:, and chore:. The .husky/commit-msg hook runs commitlint to validate every message before it is accepted into the repository.
What checks run before I can commit code to Kaneo?
The .husky/pre-commit hook runs two critical checks: biome ci . for linting and formatting validation, followed by pnpm run build to ensure the entire monorepo compiles successfully. Both must pass before Git accepts the commit.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →