The noundry.ts Manifesto

Noundry.ts Philosophy

Choose simplicity over complexity. Build with pure semantic HTML and web standards instead of heavyweight framework abstractions

Core Principle: Web Standards First

Noundry.ts embraces web standards over framework abstractions. We believe the web platform has matured to the point where, for most applications, framework-specific conventions are unnecessary overhead.

This doesn't mean frameworks are bad—they excel for highly interactive, complex UIs. But for the majority of web applications (dashboards, CRUD apps, content sites), simpler approaches using standard platform APIs are faster, more maintainable, and longer-lasting.

What Makes Noundry.ts Unique

The complete full-stack TypeScript solution built for speed and simplicity

Bun Runtime

3x faster than Node.js with built-in bundling, testing, and package management. One tool to rule them all.

🔥

HonoX Framework

File-based routing, server-side rendering with Hono JSX, and edge-ready architecture. Full-stack with zero config.

🗃️

Drizzle ORM

Type-safe database queries with automatic TypeScript inference. Supports SQLite, PostgreSQL, MySQL, and more.

🎯

Type Safety Everywhere

From database schema to API routes to UI components—full type safety with TypeScript from backend to frontend.

🔐

Authentication Ready

JWT authentication with bcrypt out of the box. Or integrate Better Auth, Auth.js, Clerk, or Auth0 in minutes.

📦

Production Monorepo

Organized workspace with separate server and client packages. Not a starter template—a production architecture.

🛠️

Powerful CLI

Scaffold projects, add UI components, generate database migrations, and more with the ndts-cli command line tool.

💅

Tailwind + BasecoatUI

Tailwind CSS v4 with beautiful shadcn/ui-inspired components. Modern styling with zero configuration.

🚀

Deploy Anywhere

Edge-ready, Docker-ready. Deploy to Fly.io, Railway, Vercel, AWS, or self-host. Your choice, your infrastructure.

Web Standards Over Framework Abstractions

Why we use standard HTML, DOM, and JavaScript instead of framework-specific conventions

1. Use class, not className

HTML has always used class. React invented className to work around JSX limitations. We don't use JSX, so we don't need this artificial distinction.

TypeScript
// ❌ React Way
<div className="container">

// ✅ Noundry Way (Hono JSX)
<div class="container">

// ✅ Noundry Way (TypeScript DOM)
createElement('div', { class: 'container' })

2. Use for, not htmlFor

Labels have always used the for attribute. React renamed it to htmlFor. We use the real attribute name.

TypeScript
// ❌ React Way
<label htmlFor="email">

// ✅ Noundry Way
<label for="email">

3. Use Standard Event Listeners

React popularized onClick, onChange, etc. The web platform has addEventListener. When we need inline events, we use lowercase onclick (the actual HTML attribute).

TypeScript
// ❌ React Way
<button onClick={handleClick}>

// ✅ Noundry Way (Hono JSX)
<button onclick="handleClick()">

// ✅ Noundry Way (TypeScript DOM - preferred)
const button = createElement('button');
on(button, 'click', handleClick);

4. Full-Stack TypeScript Architecture

HonoX handles file-based routing, API endpoints, and JSX templating. The client uses vanilla TypeScript for interactivity—no massive framework bundles required.

TypeScript
// ✅ Server API (Hono):
app.get('/api/users', async (c) => {
  const users = await db.users.findMany();
  return c.json(users);
});

// ✅ Client (TypeScript):
const users = await fetch('/api/users').then(r => r.json());

5. Vanilla TypeScript Components

Our UI components are pure TypeScript classes that manipulate the DOM directly. No virtual DOM. No reconciliation. No hooks.

TypeScript
// ✅ Noundry Way
const input = Input.create({
  name: 'email',
  type: 'email',
  placeholder: 'Enter email',
  class: 'w-full',
  onChange: (value) => console.log(value)
});

6. Embrace Web Standards

Use the web platform APIs directly without framework abstractions.

  • Use FormData for forms, not state management
  • Use URL for state management, not complex stores
  • Use fetch for HTTP, not custom wrappers
  • Use CSS classes, not CSS-in-JS
  • Use standard DOM events, not synthetic events

Why This Matters

Performance

  • No virtual DOM overhead
  • No runtime reconciliation
  • No massive JavaScript bundles
  • Smaller payload = faster sites

Maintainability

  • Code that looks like HTML/JavaScript
  • No build toolchain requirements
  • Easier to debug (no synthetic events)
  • New developers don't unlearn web standards

Longevity

  • Framework APIs evolve, requiring migration effort
  • Web standards last decades with backwards compatibility
  • Your Noundry code will work in 10+ years

Developer Experience

  • TypeScript all the way down
  • No prop drilling, no context hell
  • No useEffect dependency arrays
  • Just think in JavaScript

When Should You Use Noundry?

The right tool for the right job

Great for Noundry.ts

  • Content-driven websites and blogs
  • Admin dashboards and CRUD applications
  • E-commerce sites and marketing pages
  • Forms, authentication, and data entry
  • Server-rendered applications with progressive enhancement
  • Projects where simplicity and longevity matter

Consider React/Vue/etc.

  • Highly interactive design tools (Figma, Canva)
  • Real-time collaborative applications (Google Docs, Notion)
  • Complex data visualizations and animations
  • Applications with thousands of interactive components
  • When you have a large existing React codebase
  • Teams already expert in a specific framework

The Key Question: Does your application require frequent, complex UI state changes across many components? If not, Noundry's simplicity will serve you better than framework complexity.

Translating from React to Noundry

Coming from React? Here's how patterns translate

React Pattern Noundry Pattern
className="foo" class="foo"
htmlFor="bar" for="bar"
onClick={fn} on(el, 'click', fn)
useState let variable = value (it's just JavaScript)
useEffect addEventListener('DOMContentLoaded', fn)
useContext Function parameters or module scope
<Component /> Component.create()
Virtual DOM Actual DOM

The Web Platform Has Matured

Noundry.ts is not "React without React." It's a return to first principles: semantic HTML, standard JavaScript, and web platform APIs.

For most applications, the web platform provides everything you need—without the complexity. We're not fighting frameworks—we're choosing simplicity when it's the better tool for the job.

Noundry.ts: Web standards. No compromises. No React.