Open Source TypeScript Framework

Full-Stack TypeScript
Made Simple

Build with web standards that won. Powered by Bun, HonoX, and pure semantic HTML. No framework lock-in. No complexity. Just TypeScript + DOM.

Quick Install
bunx @noundryfx/ndts-cli init
Features

Powerful Features

Everything you need to build modern web applications with TypeScript

🚀

Bun Runtime

Ultra-fast JavaScript runtime that's 3x faster than Node.js for blazing performance

🎯

TypeScript First

Type-safe from backend to frontend with full TypeScript support throughout

HonoX Framework

Full-stack framework with file-based routing and Hono JSX server-side rendering

🗃️

Drizzle ORM

Type-safe database queries with support for SQLite, PostgreSQL, and MySQL

🎨

Web Standards First

Use `class` not `className`. Standard DOM APIs. Semantic HTML. Code that lasts decades, not framework cycles

💅

Tailwind CSS v4 + Basecoat UI

Modern utility-first CSS with beautiful shadcn/ui-inspired components

🔐

Built-in Auth

JWT authentication with bcrypt, or integrate Better Auth, Auth.js, or Auth0

📦

Monorepo Structure

Organized workspace with separate server and client packages for scalability

🎭

File-Based Routing

HonoX automatic routing - create .tsx files in app/routes/ and routes just work

Inter Font

Professional typography with Inter font family for polished, modern UI, by default

🚢

Deploy Anywhere

Ready for Fly.io, Railway, Vercel, or self-hosted with Docker support

Powered by Hono Framework

Full-stack framework, blazing fast and easy to use.

Our Philosophy

Web Standards Won

The web platform matured. Standards stabilized. We don't need framework abstractions anymore—we can build directly on the web.

🎯

Use `class`, Not `className`

HTML has always used class. It's the standard. Framework conventions like className were workarounds. Standards won—let's use them.

Direct DOM Manipulation

The DOM API is fast and mature. No virtual DOM. No reconciliation overhead. Just createElement and addEventListener. Simple. Performant. Standard.

🏛️

Built to Last Decades

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.

💡

The Framework-Free Future

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.

Optional Add-ons

Optional Integrations

Choose the features you need during project generation

Redis Caching

In-memory caching with Redis or fallback to memory cache

📬

BullMQ Queues

Background job processing for async tasks

🗂️

S3 Blob Storage

S3-compatible storage for files and assets

📝

Pino Logging

Structured JSON logging for production apps

📊

OpenTelemetry

Tracing and metrics for observability

🔑

Auth Options

Custom JWT, Better Auth, Auth.js, or Auth0

Quick Start

Get Started in Minutes

Create your first noundry.ts application with a single command

Terminal
bunx @noundryfx/ndts-cli init
Terminal
npx @noundryfx/ndts-cli init
Terminal
bun install -g @noundryfx/ndts-cli
ndts init

Quick Start Guide

1

Create Your Project

Run the CLI and follow the interactive wizard to configure your project

bunx @noundryfx/ndts-cli init
2

Navigate to Your Project

Change into your newly created project directory

cd your-app
3

Start Development Servers

Launch both the API server and the frontend development server

bun run dev

Server: http://localhost:3001
Client: http://localhost:3000

4

Start Building

Open your browser and start building your application!

Pro Tip: The CLI includes hot module replacement, so your changes appear instantly in the browser.

5

Add Pages Instantly

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

Production-Ready Components

UI Components Library

10 TypeScript components with two styling approaches: shadcn/ui or Tailwind utilities

🎨

shadcn/ui Style

Component classes for polished, professional design

const input = Input.create({
  inputClass: 'input'
});
  • ✓ Clean, minimal design system
  • ✓ Less markup, more elegance
  • ✓ Perfect for SaaS products

Noundry Default

Tailwind utilities for maximum flexibility

const input = Input.create({
  // Beautiful defaults automatically
});
  • ✓ Fine-grained control over styles
  • ✓ Familiar Tailwind approach
  • ✓ Perfect for custom branding

Available Components

📝
Input
📊
DataTable
🎯
MultiSelect
📅
DatePicker
🪟
Modal
🔍
SearchSelect
📆
DateRange
📱
SlideOver
🧭
Navigation
Pacer

🎨 Dual Styling

Choose shadcn/ui component classes or Tailwind utilities - or mix both in the same project

📦 Zero Dependencies

Pure TypeScript components with no Alpine.js or framework requirements

⚡ Production Ready

API integration, validation, accessibility, keyboard navigation - all built-in

Code Examples

See It In Action

Here's what you get out of the box

API Server (Hono + Drizzle)

packages/server/src/routes/users.ts
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

Client (HonoX + JSX)

packages/client/app/routes/login.tsx
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>
  )
}
Architecture

Project Structure

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
Learn More

Documentation

Comprehensive guides to help you build amazing applications

Tech Stack

Built With Modern Technologies

Leveraging the best tools in the TypeScript ecosystem

Bun

Runtime

🔥

Hono.js

Backend

🌊

Drizzle

ORM

Vite

Frontend

🎨

Basecoat

UI Framework

TypeScript

Language

🔐

JWT

Auth

📦

Zod

Validation

Ready to Build?

Start building production-ready TypeScript applications today