A personal TypeScript toolkit monorepo with focused packages for core utilities, runtime validation, Svelte UI, Elysia applications, and Drizzle ORM workflows.
I built these packages to keep recurring product-system concerns explicit and testable without copying ad-hoc helpers between applications.
| Package | Scope | Verification |
|---|---|---|
@frankfmy/core |
Dates, money, strings, phone normalization, business identifiers, collections, functions, IDs and cryptographic helpers | 241 tests / 634 assertions |
@frankfmy/validation |
ArkType schemas for identity, accounts, money, passwords, pagination and common request contracts | 46 tests / 72 assertions |
@frankfmy/db-utils |
Drizzle pagination, search, soft deletion, transaction retry, batch operations and seeding | 48 tests / 80 assertions |
@frankfmy/elysia-kit |
Elysia application setup, auth helpers, errors, rate limiting, logging and response contracts | 40 tests / 66 assertions |
@frankfmy/ui |
Svelte 5 + Tailwind components for forms, tables, pagination, overlays, feedback and themes | strict Svelte check, package build, and styles export consumer |
The source repository is public. The five workspace packages are versioned together at 1.1.2. Publication is allowed only from the immutable release workflow after the complete monorepo and coordinated tarball-consumer gates pass.
git clone https://github.com/FrankFMY/fmy-stack.git
cd fmy-stack
bun install --frozen-lockfile
bun run verifyimport {
formatDateRU,
formatMoneyRU,
groupBy,
validateINN,
} from "@frankfmy/core";
formatDateRU(new Date());
formatMoneyRU(1_234.56);
validateINN("7707083893");
groupBy(records, "status");import {
Email,
INN,
PasswordStrong,
UserCreate,
} from "@frankfmy/validation";
const result = UserCreate({
email: "user@example.com",
password: "Example-Passphrase-2026!",
firstName: "Example",
lastName: "User",
});import {
ApiError,
authPlugin,
createApp,
rateLimiter,
respond,
} from "@frankfmy/elysia-kit";
const app = createApp({ name: "Example API" })
.use(authPlugin({ secret: process.env.JWT_SECRET! }))
.use(rateLimiter({ max: 100, windowMs: 60_000 }))
.get("/health", () => respond.success({ ok: true }))
.listen(3000);import {
buildPaginatedResult,
paginate,
runTransactionWithRetry,
} from "@frankfmy/db-utils";
const page = await paginate(query, { page: 1, limit: 20 });
await runTransactionWithRetry(db, async (tx) => {
// transaction-owned writes
});bun run format:check
bun run lint
bun run check
bun run test
bun run build
bun run packages:check
bun auditThe current clean gate uses Bun 1.4, TypeScript 6, Svelte 5, Vite 8, Turbo 2, Drizzle ORM 0.45, and Elysia 1.4 with zero known dependency advisories.
Artem Prianishnikov
- GitHub: https://github.com/FrankFMY
- Website: https://frankfmy.com
- Email: Pryanishnikovartem@gmail.com
Apache-2.0 © 2026 Artem Prianishnikov. See LICENSE and NOTICE.