Skip to main content
Telo is under heavy development. While pre-1.0, breaking changes ship in minor releases โ€” pin your imports and expect to update manifests when you upgrade. 1.0 lands when the Rust kernel reaches feature parity with the Node.js implementation.

You declare what your app is made of โ€” its services, its routes, its data, what runs when something comes in โ€” and Telo wires it together and runs it. Control flow and the values passing between resources are declared too, and checked before anything starts.

Whole applications

On the left, everything the application is. On the right, that application running.

A server, a route with a validated response, and the handler behind it.

telo.yaml
kind: Telo.Application
metadata:
name: GreetingApi
imports:
Http: oci://ghcr.io/telorun/http-server@0.39.0
Run: oci://ghcr.io/telorun/run@0.29.0
targets:
- !ref Server
ports:
http: { env: PORT, default: 8080 }
---
kind: Http.Server
metadata:
name: Server
listen:
port: !cel "ports.http"
mounts:
- path: /v1
mount: !ref Api
---
kind: Http.Api
metadata:
name: Api
routes:
- request: { path: /greet, method: GET }
handler: !ref Greet
returns:
- status: 200
content:
application/json:
body:
message: !cel "result.message"
---
kind: Run.Value
metadata:
name: Greet
outputType:
kind: Telo.JsonSchema
schema:
type: object
required: [message]
properties:
message: { type: string }
value:
message: Hello!
Terminal
$ telo ./telo.yaml
Server listening at http://localhost:8080

$ curl localhost:8080/v1/greet
{"message":"Hello!"}

Build the first one step by step โ†’ ยท What else is caught before it runs โ†’

How it works

1. Declare it

Lay out what your app is made of, piece by piece, in YAML โ€” plus expressions and schemas for the values that flow between them.

2. Telo checks it

Mistakes get caught and explained in plain language - before anything runs.

3. Telo runs it

Your data, logic, and AI workflows go live - built straight from your description.

Under the hood

Open standards

Built on YAML, JSON Schema, and CEL - no proprietary DSL.

Static analysis

CEL type checking, reference validation, and IDE diagnostics catch errors before runtime.

Micro-kernel architecture

The kernel itself knows nothing about HTTP or SQL. Everything is a module you import, scope, and compose โ€” including the ones you write yourself, in TypeScript or Rust.

Language-agnostic

Node.js today; the YAML runtime contract is designed to be re-implemented in Rust or Go without changing your manifests.