The public site for Publira, the open-source multi-tenant publishing platform. It introduces the platform and the two libraries that grew out of it, publira/comic-viewer and publira/epub.
Built with Next.js (App Router), React, and Tailwind CSS.
pnpm install
pnpm devThe site is then served on http://localhost:3000. A Dev Container definition is included and provisions the toolchain for you.
| Command | What it does |
|---|---|
pnpm dev |
Start the development server |
pnpm build |
Produce the production build and type-check the project |
pnpm start |
Serve a production build |
pnpm check |
Verify formatting and lint rules with Ultracite (oxfmt + oxlint) |
pnpm fix |
Apply the formatting and lint fixes pnpm check reports |
pnpm install also installs the lefthook git hooks, so committing formats the staged files with oxfmt and commits the result. It reformats nothing you have left unstaged, and git commit --no-verify skips it. Lint rules and the type check are not part of the hook: run pnpm check and pnpm build before opening a pull request. pnpm build is what runs the TypeScript compiler, so a type error surfaces there rather than in pnpm check.
app/ Routes, layouts, and the global stylesheet
components/ Presentational building blocks
lib/ Content and data shared across components
assets/ Images imported by the code
Modules are addressed through the imports field of package.json rather than by relative path:
import { CodeBlock } from "#components/code-block";
import { hostScreenshots } from "#lib/screenshots";
import cover from "#assets/screenshots/01-host-catalog-top.png";#components/* and #lib/* map to targets that carry an explicit extension. TypeScript does not probe for extensions when it resolves a subpath import, so leaving them off resolves under Turbopack but fails type-checking with TS2307. #assets/* needs none, because the importing side already writes one.
Images are imported from assets/ rather than served from a public/ directory, so that Next.js derives their intrinsic size and blur placeholder at build time.
Screenshots of the platform come from the development seed data that ships with its repository, and the site says so where it shows them. Never present seeded records as a real publisher's catalog.
Colors, fonts, and spacing come from the Tailwind theme tokens declared in app/globals.css, and the palette follows the product's own. Add a new value as a token there rather than as a one-off hex in a class.
Write about Publira at the level someone deploying or evaluating it would see. The platform's own README is written for contributors, so content taken from it needs that filter rather than being transcribed:
- Name the requirement, not the local stand-in. A deployment substitutes its own services for the ones development brings up, so say "S3-compatible object storage" and "an SMTP relay".
- Leave out internal port numbers. Nobody operating the platform thinks in them.
- Leave out Dev Container specifics. They are setup mechanics for contributors, not properties of the product.