A backend programming language built in the Netherlands.
European. Cloud‑native.
Verifiable all the way down.
GDPR, DORA and NIS2 are compiler errors, not compliance theatre. Capability-secure core, reproducible builds, zero US dependencies. 2,073 tests. 432 modules. Ships today.
# Authority is explicit. Only main can mint it.
from std.cap_net import net_root, net_http_serve
from std.cap_ai import ai_root, ai_complete
from std.untrusted import untrusted_sanitize_html
fn summarise(ai: Cap<Ai>, doc: str) -> str:
out = ai_complete(ai, "mistral", doc)
# out is Untrusted<str>. To a sink raw: E0303.
return untrusted_sanitize_html(out)
fn main():
net = net_root()
ai = ai_root()
# No cap, no IO. That is E0404.
net_http_serve(net, 8080)
Sovereignty has a stack.
We started where Europe can win.
Sovereignty is not a budget line. It is a build. A computer is a stack of layers, each inheriting the one beneath it. The real question was never "can Europe build everything?" It was: which layer can Europe own first, and is that enough to protect people?
Sovereign European silicon is real work, but it is a decade away. The language layer sits above the hardware and the OS. It is where data is shaped, encrypted and moved. Own the language and you own the security and privacy that reach the user, today, without waiting for anyone's chip foundry.
You do not need to own the wire if you own the encryption that rides over it. Encrypt before the data leaves the machine and it no longer matters whose network carries it. That is the pattern kern applies everywhere: compile-time enforcement at the layer you can build now.
We started at the language and kept going. The compiler self-hosts. The container engine runs real OCI images with no Docker beneath it. The hypervisor boots a Linux guest with a disk and a NIC it emulates itself. The BLE Mesh stack reaches the device in a patient's home. Every layer is written in Kern, and the part you have to take on trust is 42,207 named lines of C with a written ledger. We wrote the stack, and you can check it.
No kill switch. No foreign override. Ever.
A single executive order, licence change or sanctions list can shut down software your institution depends on, overnight. kern removes that lever. Every component is EU-hosted, EU-governed and EUPL-licensed. No CLOUD Act. No FISA 702.
SEAL-4-ready at the software layer
The EU Cloud Sovereignty Framework (April 2026) scores cloud services on eight Sovereignty Objectives. kern maximises the software and supply-chain contribution: no non-EU dependency caps a deployer below the level their own infrastructure can reach. Full posture and boundary.
| Component | Provider | Country |
|---|---|---|
| Source code | Codeberg | Germany |
| Package registry | OVH / Scaleway | France |
| CI/CD | Woodpecker | Germany |
| Domain & DNS | TransIP | Netherlands |
| Static hosting | Codeberg Pages | Germany |
| Cloud LLM | Mistral | France |
| Vector DB | Qdrant | Germany |
What v1.1.0 actually means.
Six claims that matter most, each carrying its own status. Shipped is in the box today; gated means a CI gate blocks the build if the property regresses.
Compliance is a type, not a checklist
GDPR, DORA, NIS2 and the EU AI Act are enforced at compile time. Personal data reaching an LLM, a log or a database is a compile error. std.compliance maps each operation to its specific GDPR, DORA and NIS2 articles.
Stable, and precisely labelled
The language, stdlib, CLI and manifest surface is frozen under a written stability policy. Edition 2027 promotes selected warnings to errors, evolving the language without breaking existing code; the default edition stays backward-compatible. kern fix migrates between editions.
Ten of eleven trust steps, gated
Deterministic IR, reproducible binary, independent bootstrap, diverse double-compilation and the supply chain are per-commit CI gates. Capability enforcement and flow soundness are machine-checked in Rocq with zero admits. Open: the capability and flow models.
Capability-secure to the syscall
Every authority-bearing entry point requires an explicit Cap<T>, enforced by compile error E0404, down to the raw syscall intrinsic and the system clock. A revocable capability cannot be stashed past its frame, so revocation gates the lifetime.
Whole categories fail to compile
SQL, shell, URL, regex and template injection are compile errors, not runtime checks. So are secrets reaching a log (E0316), timing-unsafe comparison (E0317) and implicit flow on secrets (E0331). CFI on every binary (BTI+PAC on ARM64, CET on x86-64). Constant-time primitives in std.ct.
Containers and VMs, self-contained
OCI containers with no docker or runc. KVM microVMs with multi-vCPU SMP, block volumes and in-kernel virtio, one OS process per tenant. macOS sandbox via SBPL profiles. Seccomp, Landlock, cgroups and Cap<Vm>. CPU vulnerability detection and speculation barriers in std.hw.
Compliance, cloud, AI. One compile.
Compliance is a type system problem. Infrastructure is a sovereignty problem. AI is a privacy problem. One compile.
No US dependency.
Not today. Not in 2040.
Every byte of kern's supply chain is European today. No CLOUD Act exposure. No executive order risk. GDPR enforced at compile time: PersonalData<T> cannot reach analytics, logs or AI without consent. std.compliance maps operations to their GDPR, DORA and NIS2 articles. pd_forget destroys the key, so erasure is permanent.
- Compile-time GDPR, DORA, NIS2 & EU CRA enforcement
- Zero CLOUD Act / US jurisdiction exposure
- Secure<T>: graduated protection with mlock & zero-on-drop
- Built for public sector, defense & critical infrastructure
Easier than Rust.
Deploys like Go.
Python's readability, Go's deployment model, Rust's safety guarantees. gRPC, HTTP/2, SSH, NATS, S3, compression and compiled regex in the stdlib. Green threads at 100K concurrent routines. Static binaries under a millisecond cold start.
- gRPC, HTTP/2, SSH, NATS, S3 in stdlib
- OAuth2, migrations, cron, Prometheus metrics
- Sub-millisecond cold starts, static binaries
- TLS via mbedTLS, PostgreSQL, JWT in stdlib
AI that cannot leak.
Because it will not compile.
PersonalData<T> reaching an LLM is compile error E0302. Model output is Untrusted<str>, so feeding it to SQL, a shell or a file unvalidated is E0303: prompt injection stops at the type system. Multi-provider proxy (Claude, OpenAI, Mistral, Ollama), MCP server and client under the same rule, Qdrant for RAG, and EU AI Act audit logging that cannot be switched off.
- Claude, OpenAI, Mistral, Ollama in the stdlib
- Qdrant vector DB & RAG pipelines built in
- PersonalData taint propagation: PII to LLM = compile error
- Keyed HMAC-SHA256 audit logs & EU AI Act compliance
Designed after the requirements existed.
Go, Rust, Python and Node were designed before GDPR fines exceeded €4 billion, before the EU AI Act, before NIS2 made supply chain sovereignty a legal obligation. They bolt compliance on. kern compiles it in.
| Feature | Python | Go | Node.js | Rust | Kern |
|---|---|---|---|---|---|
| Readable syntax | Yes | Verbose | JS baggage | Complex | Yes |
| Single binary | No | Yes | No | Yes | Yes |
| Native async | Bolted on | Goroutines | Yes | Complex | Yes |
| Null safety | No | No | No | Yes | Yes |
| GDPR built in | No | No | No | No | Yes |
| AI native stdlib | No | No | No | No | Yes |
| Container native | No | No | No | No | Yes |
| AI agent framework | No | No | No | No | Yes |
| WASM target | No | Limited | No | Yes | Yes |
| European governed | No | No | No | No | Yes |
| Error handling | Exceptions | Values | Exceptions | Values | Values |
| Learning curve | Low | Medium | Medium | Very high | Low |
Best of Go, Rust, Python.
None of the baggage.
Type-Safe by Default
Traits with static vtables and dynamic dispatch. Secure<T> zeroes on drop, mlocks confidential data and blocks plaintext logging. A secret cannot reach a log by accident.
Traits & Algebraic Types
Nine standard traits (Display, Debug, Eq, Hash, Ord, Clone, Default, Serialize, Deserialize). Result<T> and Option<T> with match guards and range patterns.
Concurrent Async Runtime
M:N cooperative scheduler with per-coroutine preemption. spawn / await on guard-paged stacks, spawn_thread for CPU-bound work. await parks the routine, never an OS thread. select over channels and Ticker timers.
Fully Bootstrapped Compiler
13 compiler files self-host: 59K lines of Kern. LLVM backend plus a native ARM64 codegen (Mach-O writer, instruction encoder, zero LLVM dependency). Selective monomorphization, DWARF debug info, kern fmt with round-trip safety gate, and WebAssembly (wasm32-wasip1) target.
Integrated Toolchain
15-feature LSP (go-to-definition, references, rename, semantic tokens, inlay hints). kern mod / kern get with MVS resolution and kern.sum. 11 fuzz targets, ASAN/UBSAN/TSAN in CI. kern doctor in one command.
Pipe-First & String Interpolation
Data flows left to right, readable like Python. "Hello ${name}" interpolation over any expression, int() / float() conversions and default field values.
Expressive by nature.
kern's syntax reads as easily as it's written. See for yourself.
# In Python, this compiles and ships:
# analytics.track(user.email) -- GDPR violation
# send_to_ml(user.email) -- GDPR violation
# In Kern, it's a compile error:
fn send_email(user: User):
analytics.track(user.email.value)
# ERROR E0302: PersonalData<str> cannot reach a
# sink that does not declare PersonalData
# The safe path: validate consent first.
from std.compliance import check_consent
fn send_email_safe(user: User, consent: str):
check_consent("process", consent)
analytics.track_event("signup") # OK
send(user.email_plain, "Welcome!")
GDPR enforced by the compiler
No other language enforces GDPR at the type system level. PersonalData<T> cannot be passed to analytics, logging, or AI models without explicit consent and a documented reason. Violations are compile errors, not fines.
- PersonalData<T> tracks consent at the type level
- Every access is logged with reason and consent
- Passing PII to AI models is a compile error
- pd_forget destroys keys: GDPR Article 17
from std.cap_net import net_root
from net.http_server import new_server,
server_get, serve
# A cloud-native HTTP service in 12 lines
fn handle_user(body: str, headers: str) -> str:
id = http_param("id")
return "{\"id\":" + id + "}"
fn main():
net = net_root() # only main mints it
server = new_server(net, 8080)
http_route_handler("GET", "/users/:id", handle_user)
server_get(server, "/health", "{\"status\":\"ok\"}")
serve(server)
Cloud-native by default
An HTTP service with path parameters, a health endpoint, and capability-gated network access. No reverse proxy, no framework, no third-party package. A module without Cap<Net> cannot listen or dial at all.
- Path parameters with
http_param - Middleware via
http_use - Static binaries, sub-millisecond cold starts
from std.cap_ai import ai_root, ai_complete
from std.untrusted import untrusted_validate_length
# Model output is Untrusted<str> at the source.
# EU AI Act audit logging is automatic.
fn answer(ai: Cap<Ai>, question: str) -> Result<str>:
reply = ai_complete(ai, "mistral", question)
# Straight to a sink would be E0303.
return untrusted_validate_length(reply, 1, 4000)
fn main():
ai = ai_root() # only main mints it
print(answer(ai, "How do I deploy?"))
Multi-provider LLM with audit trail
Anything a model returns is Untrusted<str> at the source, so feeding a reply into SQL, a shell or a file without validating it is a compile error, and prompt injection stops at the type system. Personal data reaching an LLM is rejected the same way. Claude, OpenAI, Mistral and Ollama sit behind one proxy, with Qdrant for RAG.
- Claude, OpenAI, Mistral, Ollama in stdlib
- Qdrant vector DB & RAG pipelines
- PersonalData taint propagation
- Keyed HMAC-SHA256 audit logs & EU AI Act compliance
from std.cap_container import container_root,
cc_pull, cc_run, cc_wait_ready, cc_logs, cc_stop
from std.cap_time import time_root
# Nothing on the host but this binary,
# a 5.15 kernel and libc.
fn main():
c = container_root()
clock = time_root()
cc_pull(c, "debian:bookworm-slim")
id = cc_run(c, "debian:bookworm-slim")
cc_wait_ready(c, id)
print(cc_logs(c, id))
cc_stop(clock, c, id)
# A module without Cap<Container> cannot
# start a container at all: E0404.
Real OCI images, no Docker underneath
The container engine is compiled into the language. It pulls and runs real images using namespaces, cgroup v2, overlayfs and pivot_root, with hand-rolled netlink for networking, so there is no docker, podman, runc, skopeo or iptables on the host to install, patch or trust.
- Pulls and runs
debianandalpineimages directly - Signature verification and digest pinning on pull
- Rootless mode, with published ports and compose service DNS
kern audit-dockerproves a build takes no Docker dependency
from std.cap_process import process_root
from std.cap_fs import fs_root
from sys.microvm_orchestrate import vm_spawn,
vm_stats, vm_wait, vm_audit_verify
fn main():
p = process_root()
fs = fs_root()
# One OS process per tenant, each with its own
# cgroup, Landlock scope and seccomp jailer.
t = vm_spawn(p, fs, "vm_runner", [], "tenant-a",
512 * 1024 * 1024, 100, 128,
"/var/log/vm.audit")
print(vm_stats(fs, t))
vm_wait(p, fs, t, "/var/log/vm.audit")
vm_audit_verify(fs, "/var/log/vm.audit")
A hypervisor you can read
The monitor is written in Kern rather than borrowed, so the multi-tenant isolation boundary is auditable in one language. It boots an unmodified Linux kernel on KVM from a distro rootfs, with a virtio-blk disk and a virtio-net NIC it emulates itself.
- Authority split by capability: only the runner mints
Cap<Vm> - Every guest address proven inside guest RAM before use
- Minting
Cap<Vm>derives a seccomp filter for the VM host - Created, booted, stopped and reaped all land in a hash-chained audit log
1.0-grade implementation.
Independently verifiable.
A real backend toolbox.
Not a language demo.
TLS, a database, auth, metrics, compliance evidence and a way to ship. kern's stdlib carries all of it, with no third-party packages and no US-hosted service in the path.
Self-hosting, 2,073 tests at 100% pass, race-free, reproducible byte-for-byte. API surface frozen under a written stability policy with edition-based evolution. Ten of eleven trust-roadmap steps done and CI-gated. Capability enforcement, lexer bisimulation and flow-analysis soundness machine-checked in Rocq with zero admits. Release tags signed with pinned keys; no compiler binary published, the installer builds from source.
TLS & HTTPS
HTTPS without a reverse proxy. TLS 1.2/1.3 floor with forward secrecy, ACME v2, hot-reload on renewal.
PostgreSQL
Parameterised queries, transaction batches, LISTEN/NOTIFY, connection pooling. SQL checked against your schema before it runs.
gRPC & HTTP/2
gRPC over protobuf, HTTP/2, SSH, NATS, S3 with Sig V4. No third-party package for service-to-service work.
CycloneDX SBOM & EU CRA
CycloneDX 1.5 and SPDX 2.3 out of the box. Four dependencies to declare, not four hundred.
EU-sovereign cloud KMS
Keys stay in Europe. Scaleway, Azure Key Vault, local AES-256-GCM. Plaintext secrets reaching IO sinks are compile errors.
Container engine & hypervisor
OCI containers and KVM microVMs, self-contained. No docker, podman or runc. One OS process per tenant, in-kernel virtio datapath.
Regulation article mapping
Every data operation maps to its GDPR, DORA and NIS2 article. Consent validation, data classification and adequacy checks included.
Tamper-proof audit logs
HMAC-SHA256 chain, keyed to the machine. Full re-verification on open. The artifact a DORA or NIS2 examiner asks to see.
Post-quantum crypto
Ed25519, ChaCha20-Poly1305, Argon2, BLAKE2b via libsodium. ML-KEM-768 and ML-KEM-1024 for post-quantum readiness.
Fastest where a backend lives.
Honest about the rest.
Fifty-five backend workloads on six languages, same algorithm and same data sizes on every side, using only each language's standard library. No JIT pre-warming, no micro-tuning, Go as a native binary. Five representative rows below. kern is faster than Go on Fibonacci, JSON encoding and sorting. It loses on hashing (Go links hardware-accelerated SHA-256; kern uses libsodium's portable implementation) and on file I/O (kern's file-IO cell shows 147% run-to-run spread in this matrix; the loss holds at the minimum too). Losses are stated, not framed away. Methodology and the full 55-row matrix are in the repo.
| Workload | kern | vs Go | vs Node.js | vs Python |
|---|---|---|---|---|
| File I/O 10k write+read cycles | 2,322 ms | 2.7× slower | 2.5× slower | 2.5× slower |
| Fibonacci recursive, n=35 | 29 ms | 1.2× faster | startup-bounded | 32× faster |
| JSON encode 100k iterations | 43 ms | 1.5× faster | startup-bounded | 5.3× faster |
| Sort 1M pseudo-random integers | 46 ms | 1.3× faster | 11× faster | 5.2× faster |
| Hash 1M iterations, SHA-256 on every side | 299 ms | 1.4× slower | 5.9× faster | 2.0× faster |
~9,000 requests/second sustained at 100-way concurrency, with zero failures across 50,000 requests (measured with ab). Backed by libuv, the same event loop that powers Node.js.
Median of seven runs (first discarded), Ubuntu 24.04 x86-64 i9-10900K, CI paused, release builds. Go 1.24, Node 22, Python 3.12; full matrix also includes Rust and C. Single-process, single-core. Spread under 12% except kern file I/O (147%, noisy cell: 2,322 ms median vs 1,127 ms minimum; loss holds at min but ratio is approximate). Hash: kern uses libsodium's portable SHA-256; Go links hardware-accelerated SHA-256. Same algorithm, different silicon. Closing this gap is a named work item. "Startup-bounded" = workload under 3x the language's startup floor. Micro-benchmarks are signals, not proof. Suite and method in the repo. Last measured 2026-10-15.
Built from source, on your machine.
Install kern
$ curl -fsSL https://kern-lang.eu/install.sh | sh
Scaffold a working service
$ kern new api my-service
Created api project: my-service
$ cd my-service
Run it
$ kern build src/main.kern -o my-service && ./my-service
Binary written to my-service
Build complete.
my-service listening on http://localhost:8080
# in another shell
$ curl localhost:8080/health
{"status": "ok"}
Built for the institutions
that define Europe's future.
Kern is for
- EU institutions and member state agencies building sovereign digital infrastructure
- Critical infrastructure operators under NIS2: energy, transport, health, water
- Central banks, financial market infrastructure, and DORA-regulated institutions
- Defense and intelligence services requiring sovereign, auditable tech stacks
- Enterprise teams deploying AI agents where PII leakage is a regulatory risk
Kern is not for
- Data scientists who need NumPy and pandas: use Python
- Systems programmers building operating systems: use Rust
- Teams with ten years of Go investment: switching has a cost
- Projects that need Windows support: kern targets Linux and macOS
Sovereign infrastructure
for the next decades.
Sovereignty is not a budget line. It is a build. kern runs today: European independence compiled in, not promised. Verifiable, not asserted.
Keep it independent
kern is EUPL-licensed and community-funded. No venture capital, no US parent company, no strings. Contributions go directly to compiler and stdlib development.
3HcHaeq9gYrxxLqzbpBSuy3e6cGAw6GwZc