Lightweight Universal Conversational Architecture

Luca: One Container
to Rule Them All

stop rebuilding the same shit

You've Built This Before

Every developer has built the same plumbing. Nobody caches it.
02

Think Docker Layers

Layer 3: Your App The actual thing you're building changes daily
Layer 2: Domain AI clients, GitHub, Stripe, your industry changes rarely
Layer 1: Platform fs, networking, processes, state, events solve once
Fix Layer 1 once. Every project benefits. Spend ALL your energy on Layer 3.
03

One Object. Everything You Need.

import container from 'luca/node'

container.fs          // file system
container.git         // git operations
container.ui          // terminal UI
container.proc        // process execution
container.networking  // port utilities

// Need something specific? Ask for it
const cache  = container.feature('diskCache')
const rest   = container.client('rest', { baseURL: 'https://api.stripe.com' })
const server = container.server('express', { port: 3000 })
Like window + document, but for your entire stack
04

Everything Is a Helper

Helper
The universal base class
Feature
Client
Server
Command
Endpoint
Observable State Event Bus Introspection Tool Interface
Same API. Same patterns. Whether it's a file system or a Stripe client.
05

Everything Is Watchable

const cart = container.feature('cart')

// State is typed, versioned, observable
cart.state.set('items', [...items, newItem])
cart.state.get('total')       // always current
cart.state.version             // increments on every change

// React to changes
cart.state.observe((type, key, value) => {
  if (key === 'items') renderBadge(value.length)
})
Debugging, analytics, reactive UI, AI monitoring — all fall out for free
06

Components Talk.
They Don't Import Each Other.

// Auth announces things
auth.emit('userLoggedIn', user)

// Analytics listens — doesn't need to import auth
auth.on('userLoggedIn', (user) => {
  analytics.track('login', { userId: user.id })
})

// Wait for anything, anywhere
await server.waitFor('started')
await db.waitFor('connected')
console.log('All systems go')
Typed contracts. Build-time autocomplete. No magic strings.
07

Discover. Create. Cache.

// What's available?
container.features.available  // ['fs', 'git', 'ui', 'proc', ...]
container.clients.available   // ['rest', 'websocket', 'openai', ...]

// Factory creates instances — same args = same instance
const api  = container.client('rest', { baseURL: 'https://api.github.com' })
const api2 = container.client('rest', { baseURL: 'https://api.github.com' })

api === api2 // true — identity guarantee
Self-registration at import time. No central manifest to maintain.
08

Convention Over Configuration

my-app/
├── commands/       luca seed --count 10
├── endpoints/      luca serve (auto-discovered routes)
├── features/       container.feature('myThing')
├── assistants/     AI assistants with tool access
├── scripts/        luca run migrate.ts
└── luca.cli.ts     project-level hooks
Drop a file in the right folder. It just works.
09

Solve It Once. Use It Forever.

📜

Scripts

One import. Full runtime. File system, git, processes, UI — all there.

🌐

Servers

Drop files in endpoints/. Get a REST API with OpenAPI docs. Done.

⚛️

React

Observable state = built-in data layer. No extra state library needed.

Same container. Same patterns. Every environment.
10

Stop Rebuilding.
Start Composing.

bun add luca