An open-source language, taking flight ↗

Osprey.
Logic, in flight.

Keep the logic clear.
Choose how it meets the world.

A functional language built around algebraic effects. Your code declares what it needs. You choose the handler that makes it happen.

greeting.osp
effect Account { name: fn() -> string }
fn greet() = "Hello, " + perform Account.name()

let ada = handler Account { name => "Ada" }
let grace = handler Account { name => "Grace" }

print("${ada(greet)} / ${grace(greet)}")
Hello, Ada / Hello, GraceOUTPUT

One function. Two handlers. The same logic.

INFERRED TYPESEXPLICIT EFFECTSCOMPILED WITH LLVMOpen source. MIT licensed. ↗

01 / A different way to connect

Your logic stays.
The implementation changes.

Read an account. Write a log. Save a document. Declare a typed request, then decide how to answer it at the application boundary.

Use the real database in production and a predictable answer in a test. The functions in between stay focused on their work.

Understand algebraic effects ↗
  1. 01

    Declare the need.

    effect defines an operation and its types. perform asks for it.

  2. 02

    Choose the behavior.

    A reusable handler supplies the implementation while your function runs.

  3. 03

    Let the compiler check the boundary.

    Missing handlers and incompatible operation types are compile errors.

Osprey is alpha software. Native control effects support single-shot resumption; full scoped effect rows and reusable continuations remain in development. Current support →

02 / Less ceremony. More intent.

A language that leaves
room for your thinking.

Types that follow your thinking

Inferred static types, immutable data, and exhaustive pattern matching. Expected failures remain visible as Result values.

Explore the type system ↗

Two flavors. One language.

Familiar braces and calls, or ML layout and currying. Mix .osp and .ospml files in one project with the same types and effects.

Find your syntax ↗

Concurrency that reads directly

Native fibers and channels keep concurrent work in ordinary functions. Choose the default allocator, tracing GC, or reference counting for your native build.

Follow the fibers ↗

Arithmetic with a stated policy

Integer overflow asks an Arith handler for the region's chosen behavior. Wrapping and saturating helpers make that choice explicit.

See arithmetic effects ↗

03 / Take it into the world

One language.
A wider horizon.

Compile through LLVM to native programs, WebAssembly, or application logic for native mobile hosts.

Build for the capabilities of your target. Unsupported dynamic control effects are rejected on WebAssembly and mobile.

Real measurements, open benchmarks ↗

04 / From language to application

Shared logic.
Native feel.

Issue Inbox puts its model, updates, UI layout, GitHub decoding, and SQLite commands in shared Osprey modules. SwiftUI and Android widgets render the application.

  • Browse and search GitHub issues
  • Save issues, notes, and priorities
  • Restore your inbox from SQLite

Actual simulator and emulator captures. Also verified on a physical iPhone. Native hosts provide rendering, SQLite, HTTPS, and lifecycle services.

Your next idea starts here

Give it wings.

Start with a small program. Make the behavior your own.

Start in your browser

Explore the language without installing anything.

Open Playground ↗

macOS / Linux

brew install nimblesite/tap/osprey

Windows

scoop bucket add nimblesite https://github.com/Nimblesite/scoop-bucket
scoop install osprey

Native compilation requires clang (LLVM 15+). Installation guide → · Contribute on GitHub ↗