Repository home

One page, three audiences. Visitors get a landing page; contributors get how to start and what to pick up; maintainers get the day first, with New branch. VibeLang declares its own .smithers/home.json; Effect has none, so Smithers curates one.

smithers.sh/smithersai/vibelang
Signed out

smithersai / vibelang

Effect-TS / effect

Issues Stack Sign in

Today

Maintainers

Contribute

Contributors

Set up

Go, Bun and Node on your PATH, then one command builds the compiler, the runtime and the editor extension.

$sh scripts/setup.sh
$sh scripts/e2e.sh

How a change lands

Pick a TODO or an issue

Or ask Smithers for a new TODO.

Work on its branch

With its conversation, terminal and views.

Open a pull request

Tests and docs in the same change.

A maintainer reviews and merges

People merge; agents never do.

v0: the language will change

VibeLang

Reliable TypeScript for the AI era, built on Effect.

A simple, readable syntax for Effect that compiles to TypeScript, with first-class access to the TypeScript ecosystem.

$npm create vibelang@latest my-app
main.vibe
error NotFound { id: string }

service Users {
  find(id: string): User!NotFound
}

function greet(id: string) {
  return `Welcome, ${Users.find(id).name}`
    catch (e) => `No user ${e.id}`
}

export function main() {
  provide UsersLive {
    const [ada, missing] = await.all [greet("42"), greet("7")]
    Console.log(ada, missing)
  }
}
MITLicense
Effect 4Runtime
macOS · Linux · Windowsarm64 and x64
0.0.1Latest on npm

Why VibeLang

Every function is an Effect

A call runs where it stands; no `yield*`, no generators.

Typed errors

`error NotFound { id }` and `User!NotFound` in the signature.

Services and layers

`service`, `provide` and `Layer` as language.

Concurrency

`await.all`, `await.race`, `fork` and `join`.

Your editor knows it

Diagnostics, hovers and completions from the compiler.

TypeScript interop

Checks `.vibe` and `.ts` together; emits JavaScript and types.

Releases

  • vibelang@0.0.1

    The first release on npm: the compiler, runtime and starter.

All releases →

Questions about VibeLang?

Ask Smithers about this repository… Ask

Today

Maintainers

Your work

Contributors

What should we work on?

Ask Smithers about Effect… Ask
Effect 4.0 is here Read →

Effect

Build production-ready applications in TypeScript.

Typed errors, dependency injection, structured concurrency, retries, tracing and schemas in one library with zero dependencies.

$npm install effect
fetch-user.ts
import { Data, Effect, Schedule } from "effect"

class FetchError extends Data.TaggedError("FetchError")<{
  readonly cause: unknown
}> {}

const getUser = (id: string) =>
  Effect.tryPromise({
    try: (signal) => fetch(`/users/${id}`, { signal }),
    catch: (cause) => new FetchError({ cause })
  })

// Typed failure, retried with backoff, bounded in time.
const program = getUser("42").pipe(
  Effect.retry({
    times: 3,
    schedule: Schedule.exponential("100 millis")
  }),
  Effect.timeout("5 seconds")
)
MITLicense
0Dependencies
TypeScript 5.9+Strict mode
Node · Bun · Denoand browsers

Why Effect

Typed errors

Every failure is in the type, so the compiler lists what you haven't handled.

Dependency injection

Services and layers, checked at compile time, swapped in tests.

Structured concurrency

Fibers that cancel cleanly, with no leaked work.

Retries and scheduling

Backoff, jitter and timeouts as values you compose.

Built-in tracing

Spans and metrics with OpenTelemetry, no extra code.

Schema

One definition to validate, decode, encode and document data.

Releases

All releases →

Who sees what

SectionVisitorContributorMaintainer
Today: New branch, triage, pull requests, stack, runs, branchesnonoyes
Contribute: setup, open TODOs, how a change lands, where to askno*yesyes
Landing: hero, code, why, benchmarks, ecosystem, releases, askyesyesyes

* A repository can open Contribute to anyone with the link: "contributors": "anyone".

Who is who

  • Maintainer: a Maintainer or an Admin.
  • Contributor: anyone signed in with a role on the repository, Guest included; or anyone, when the repository opts in.
  • Visitor: everyone else, signed out included.
  • ChatApi decides the audience from the session and never sends a curated section above it. Each live block's rows come from its own shape, which checks the role again.

New branch

  • An action block: a primary button that runs one flow, branch.new, and its key, B, while you aren't typing.
  • It makes the branch at the default branch's head on the repository's forge and opens its workspace: conversation, terminal and views (0013).
  • The same branch/create flow is /branch.new and the agent's.
  • Branches shows who is on which branch; it needs a branches shape and is not built yet.