Appearance
Shared TypeScript packages
Small production packages shared by independent products. They are infrastructure for reusable capabilities, not a product or application framework. Products consume these packages and retain ownership of their business logic.
Packages use the @finluth scope and publish to Finluth Git's npm registry. See npm package registry.
Do not move code into packages merely because it is shared once. Extract something when it represents a stable, reusable capability.
Local development
Requires Node.js 20 or newer and pnpm 11.19.0 (pinned in package.json).
sh
pnpm install
pnpm build
pnpm test
pnpm lint
pnpm typecheckRun a package task by filtering, for example pnpm --filter @finluth/logger test.
Packages
@finluth/config
Small, dependency-free helpers for reading configuration values. The caller passes an environment-like record, so the package does not read process globals or define application-specific variables.
ts
import { optionalConfig, requireConfig } from '@finluth/config';
const port = Number(requireConfig(process.env, 'PORT'));
const sentryDsn = optionalConfig(process.env, 'SENTRY_DSN');@finluth/logger
A dependency-free structured logger with debug, info, warn, and error levels. Readable lines outside production and JSON in production.
ts
import { createLogger } from '@finluth/logger';
const logger = createLogger({ level: 'info' });
logger.info('Server started', { port: 3000 });@finluth/ui
A few accessible React primitives (Button, Input, Label, Card, Badge), not a complete design system. React 18 or 19 is a peer dependency.
Import from the package root, such as import { createLogger } from '@finluth/logger'; do not import from src/.