Jennifer is an interpreted programming language.
Jennifer is batteries-included:
41 built-in libraries and
74 distributable modules - over 2,000 functions,
constants, and types cover what real tools need. Talk to a database with the
SQL library (MySQL/MariaDB/Galera and PostgreSQL,
parameterized and injection-safe) or map rows to structs with the
ORM. Read and write JSON,
YAML, TOML, and
XML; match text with full
regular expressions. For the web there is an
HTTP/S client and REST layer to
call out, and a built-in HTTP server and
web framework to serve. Email: SMTP
to send, POP3 / IMAP to receive.
Caches and stores: Redis and
memcached clients. Security:
AES-256-GCM, Ed25519, HKDF / PBKDF2, and
JWT. The Model Context Protocol
module exposes your functions as tools / resources / prompts to an AI host
(Claude, an IDE, ...) or calls another MCP server as a client, validated end to
end against the official MCP SDK. Lightweight
concurrency is built into the language via
spawn and the task library. More niche needs are
covered too: Gotify push, strict
SemVer, S3 object storage,
vCard / iCalendar,
MQTT and AMQP messaging,
ACME certificate issuance,
TOTP two-factor codes, and more.
The interpreter and its built-in libraries ship as one self-contained static
binary - about 17 MB with everything, about 5 MB for the embeddable build - with
no separate runtime and no dependency tree to resolve. The modules ship as plain
.j source files (installed beside the binary and resolved through the module
path), readable and editable with no compile step. Third-party decks
(Jennifer's packages) are opt-in and vendored into your project's own tree - no
global install, no daemon - with the jvc
package manager to resolve and pin them, and imported as
import "@scope/package/";.
Jennifer also suits teaching and learning: an interactive
REPL, an
easy-to-read grammar, and
token and AST dumps for studying language
design, plus a built-in linter,
profiler, and
test support. Its
strict, explicit design - conditions must be
bool, conversions are spelled out, names never shadow, and errors are
positioned - turns a mistake into a clear message instead of a silent
surprise.
The interpreter is written in Go and ships as two binaries:
jennifer (standard Go toolchain, full host-feature surface, the default)
and jennifer-tiny (built with TinyGo, smaller and
embeddable; missing os/exec and the network stack). make build produces
both side by side. Source files use the .j extension.
Jennifer's supported platform is Linux. Best-effort, unsupported macOS (Intel and Apple Silicon) and Windows (64- and 32-bit) binaries are published alongside each release - see Install for the caveats.
Same source, same language; pick by use case:
jennifer(standard Go toolchain, the default): full host-feature surface, competitive on single-thread compute and the reliable choice for multi-core parallelspawn(it wins the end-to-end wall clock whenever parallelism is in play), supportsos.run/os.spawn/ the wholenetlibrary. Use this unless you need the constrained variant.jennifer-tiny(TinyGo): smaller binary, embeddable in minimal-footprint deployments (embedded systems, minimal containers, small-footprint scripting hosts). Trade-off: noos/exec(TinyGo runtime gap) and no network stack (no netdev driver registered). Calls into those surfaces return a friendly runtime error pointing back atjennifer.
Both binaries install side by side. Benchmarks comparing the two on the same workload set live in docs/technical/benchmark.md.
Linux is the supported platform. Best-effort unsupported macOS
and Windows binaries (the standard jennifer build only, no TinyGo) are
attached to each release;
read the caveats in
docs/user-guide/installing.md
before relying on them.
# Debian / Ubuntu - pick the .deb for your arch from the Releases
# page (https://github.com/jennifer-language/jennifer/releases) and:
sudo dpkg -i jennifer_X.Y.Z_amd64.deb
# Arch (AUR) - prebuilt binary, fast install:
yay -S jennifer-bin
# Or build-from-source, tracks main:
yay -S jennifer-git
# Any Linux - tarball download + extract:
tar -xzf jennifer-X.Y.Z-linux-amd64.tar.gz
cd jennifer-X.Y.Z-linux-amd64
./jennifer version
# Build from source (developer path, any platform with Go + TinyGo):
make buildSee docs/user-guide/installing.md for verified checksums, the full FHS layout, system-wide install commands from a tarball, the container image (Docker / Podman), the Windows installer, and platform-specific notes.
Syntax highlighting for your editor lives in editors/: a drop-in for Vim / Neovim, a VS Code extension, a Sublime Text syntax, a TextMate grammar for Zed and other TextMate-based editors, and a highlight.js definition for static sites.
AI assistants have no built-in knowledge of Jennifer, so the repo ships
JENNIFER.md, a self-contained language reference. Drop it into
your project and point your assistant at it ("we code in Jennifer, see
JENNIFER.md") and it writes correct .j instead of guessing
Python-with-dollar-signs. Details in
docs/user-guide/tooling.md.
Jennifer is pre-1.0. While the major version stays at 0.x.y,
anything can change at any time - syntax, semantics, library names,
function signatures, file formats. We aim for best-effort stability
between minor versions but make no guarantees: a milestone may rename a
keyword, retype a builtin, or restructure the standard library when a
better design is found. Pin to a specific version if you need
reproducibility; expect to migrate when you upgrade.
Starting with 1.0.0, Jennifer will follow Semantic
Versioning: breaking changes only on a major
version bump, additive features on minor, fixes on patch.
Seven design stances shape every feature in Jennifer. "Convenience" is rejected when it creates parallel ways to do the same thing or hides what the code does. See docs/design-stances.md for the full table and rationale.
If you cloned the repo and want to build + iterate locally:
# Build both binaries side by side
make build
./jennifer run examples/hello.j # prints "42" (standard Go, default)
./jennifer-tiny run examples/hello.j # prints "42" (TinyGo, constrained)
# Quick iteration without rebuilding
go run ./cmd/jennifer run examples/hello.jA first program:
use io;
def x as int init 21;
io.printf("%d\n", $x + $x);
The full docs are built with Grimoire
and served at jennifer-lang.dev
(published from main on every push). The same content also reads
fine inside the GitHub file tree:
- docs/user-guide/ - language tutorial and reference split by topic: installing, first program, syntax, types and values, functions, control flow, concurrency, imports, tooling, style guide, best practices, performance, examples.
- docs/libraries/ - per-library reference
- alphabetical cheatsheet of every builtin.
- docs/technical/ - interpreter internals: lexer, grammar / parser, preprocessor, interpreter, CLI, testing, TinyGo notes.
- docs/milestones.md - what's implemented, what's coming, and the rationale behind the order.
- RELEASE.md - the maintainer-facing release checklist.
go test ./...Tests run under the standard Go toolchain because TinyGo's testing
support is partial. After non-trivial changes, smoke-test both
binaries (make build produces them) since a few standard-library
features behave differently under the TinyGo runtime - see
docs/technical/tinygo.md for the
current restriction list.
LGPL-3.0-only. The full license text and copyright information
ship inside the packaged distributions
(packaging/debian/copyright for the
.deb, the AUR packages reference the upstream license);
gnu.org/licenses/lgpl-3.0.html
is the canonical text.