Build with web standards that won. Powered by Bun, HonoX, and pure semantic HTML. No framework lock-in. No complexity. Just TypeScript + DOM.
bunx @noundryfx/ndts-cli init
Everything you need to build modern web applications with TypeScript
Ultra-fast JavaScript runtime that's 3x faster than Node.js for blazing performance
Type-safe from backend to frontend with full TypeScript support throughout
Full-stack framework with file-based routing and Hono JSX server-side rendering
Type-safe database queries with support for SQLite, PostgreSQL, and MySQL
Use `class` not `className`. Standard DOM APIs. Semantic HTML. Code that lasts decades, not framework cycles
Modern utility-first CSS with beautiful shadcn/ui-inspired components
JWT authentication with bcrypt, or integrate Better Auth, Auth.js, or Auth0
Organized workspace with separate server and client packages for scalability
HonoX automatic routing - create .tsx files in app/routes/ and routes just work
Professional typography with Inter font family for polished, modern UI, by default
Ready for Fly.io, Railway, Vercel, or self-hosted with Docker support
Full-stack framework, blazing fast and easy to use.
The web platform matured. Standards stabilized. We don't need framework abstractions anymore—we can build directly on the web.
HTML has always used class. It's the standard.
Framework conventions like className were workarounds.
Standards won—let's use them.
The DOM API is fast and mature. No virtual DOM. No reconciliation overhead.
Just createElement and
addEventListener.
Simple. Performant. Standard.
Framework APIs change every few years. Web standards last decades. Your code will work in 2035 without rewrites, migrations, or breaking changes. That's the power of standards.
Frameworks taught us component thinking, but they also introduced complexity: virtual DOMs, synthetic events, special JSX rules, proprietary APIs. The web platform evolved—we have Custom Elements, Shadow DOM, modern CSS, and TypeScript for type safety.
Noundry.ts embraces this evolution. Build with TypeScript classes that create real DOM elements. Use semantic HTML. Follow web standards. Your code becomes simpler, faster, and future-proof.
Choose the features you need during project generation
In-memory caching with Redis or fallback to memory cache
Background job processing for async tasks
S3-compatible storage for files and assets
Structured JSON logging for production apps
Tracing and metrics for observability
Custom JWT, Better Auth, Auth.js, or Auth0
Create your first noundry.ts application with a single command
bunx @noundryfx/ndts-cli init
npx @noundryfx/ndts-cli init
bun install -g @noundryfx/ndts-cli
ndts init
Run the CLI and follow the interactive wizard to configure your project
bunx @noundryfx/ndts-cli init
Change into your newly created project directory
cd your-app
Launch both the API server and the frontend development server
bun run dev
Server: http://localhost:3001
Client: http://localhost:3000
Open your browser and start building your application!
Pro Tip: The CLI includes hot module replacement, so your changes appear instantly in the browser.
Use the page generator to scaffold new pages with pre-built templates
ndts page
Choose from: Blank Page, Form, Data Table, Grid Layout, or Detail View
10 TypeScript components with two styling approaches: shadcn/ui or Tailwind utilities
Component classes for polished, professional design
Tailwind utilities for maximum flexibility
Choose shadcn/ui component classes or Tailwind utilities - or mix both in the same project
Pure TypeScript components with no Alpine.js or framework requirements
API integration, validation, accessibility, keyboard navigation - all built-in
Here's what you get out of the box
import { Hono } from 'hono'
import { db } from '../config/db'
import { users } from '../schema'
const app = new Hono()
app.post('/register', async (c) => {
const { email, password, name } = await c.req.json()
// Hash password and create user
const user = await db.insert(users).values({
email, password, name
})
return c.json({ user })
})
export default app
import { jsxRenderer } from 'hono/jsx-renderer'
export default function Login() {
return (
<div class="min-h-screen bg-gray-50 flex items-center">
<div class="container mx-auto">
<form id="login-form" class="card max-w-md mx-auto"
<h1 class="text-2xl font-bold mb-4">Login</h1>
<input type="email" name="email" class="input" />
<input type="password" name="password" class="input" />
<button class="btn btn-primary"Sign In</button>
form>
div>
div>
)
}
Clean, organized monorepo structure
your-app/
├── packages/
│ ├── server/ # Hono API server
│ │ ├── src/
│ │ │ ├── config/ # Environment, database, cache
│ │ │ ├── middleware/ # Auth, logging, errors
│ │ │ ├── routes/ # API endpoints
│ │ │ ├── schema/ # Database schema (Drizzle)
│ │ │ └── index.ts # Server entry point
│ │ └── package.json
│ │
│ └── client/ # HonoX with Hono JSX
│ ├── app/
│ │ ├── routes/ # File-based routing (.tsx)
│ │ │ ├── index.tsx # Home page
│ │ │ ├── login.tsx # Login
│ │ │ ├── dashboard.tsx # Dashboard
│ │ │ └── records/ # CRUD routes
│ │ ├── components/ # Reusable components
│ │ ├── server.ts # HonoX entry point
│ │ ├── global.tsx # Global layout
│ │ └── style.css # Tailwind + Basecoat
│ ├── public/static/js/ # Client-side utilities
│ ├── vite.config.ts # HonoX Vite config
│ └── package.json
│
├── .env.example
├── package.json # Monorepo scripts
└── README.md
Comprehensive guides to help you build amazing applications
Get up and running in minutes with step-by-step instructions
Understand the full-stack architecture and design decisions
Learn how to build UIs with pure HTML and TypeScript
Deploy to Fly.io, Railway, Vercel, or self-hosted environments
Configure databases, caching, queues, and more
Quick reference for all CLI commands and workflows
Leveraging the best tools in the TypeScript ecosystem
Runtime
Backend
ORM
Frontend
UI Framework
Language
Auth
Validation
Start building production-ready TypeScript applications today