Lightweight Universal Conversational Architecture
stop rebuilding the same shit
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 })
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) })
// 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')
// 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
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
One import. Full runtime. File system, git, processes, UI — all there.
Drop files in endpoints/. Get a REST API with OpenAPI docs. Done.
Observable state = built-in data layer. No extra state library needed.
github.com/soederpop/luca