The Linux and Windows release packages are built to include the compiler and the toolchain pieces needed by normal users, including LLVM tools where the package format supports bundling them. After installation, verify the compiler is on your PATH:
seen --version
The shipped binary also prints command usage when no command is supplied:
seen
Source builds still need local build tools because they rebuild the compiler and runtime:
clang, opt, llc, llvm-as, and lld (LLVM 20 is preferred and used by hosted CI)seen-pkg helperOn Ubuntu/Debian:
sudo apt install llvm-20 clang-20 lld-20 libclang-rt-20-dev gcc git
On Arch Linux:
sudo pacman -S llvm clang lld gcc git
On macOS:
brew install llvm gcc git
After cloning the repository, follow the complete capped command in Bootstrap System. Use an explicit tier: --tier quick produces the development compiler, while --tier verify produces the verified compiler_seen/target/seen. Never invoke the rebuild script uncapped.
Create hello.seen:
fun main() {
println("Hello, Seen!")
}
Compile and run:
seen compile hello.seen hello
./hello
Or compile and execute in one step:
seen run hello.seen
A Seen project uses Seen.toml for configuration:
my_project/
├── Seen.toml
├── src/
│ └── main.seen
└── tests/
└── test_main.seen
Minimal Seen.toml:
manifest-version = 1
[project]
name = "my_project"
version = "0.1.0"
language = "en"
[dependencies]
[native.dependencies]
manifest-version = 1 is the current manifest schema. Keep it at the top of new manifests. Publishing also requires the strict package/dependency fields in the packaging guide.
The language field sets the keyword language. Supported languages are en, ar, es, ru, zh, and ja.
Example program:
class Counter {
var count: Int
static fun new() r: Counter {
return Counter { count: 0 }
}
fun increment() {
this.count = this.count + 1
}
fun value() r: Int {
return this.count
}
}
fun main() {
let counter = Counter.new()
var i = 0
while i < 10 {
counter.increment()
i = i + 1
}
println("Count: {counter.value()}")
}
Compile:
seen compile src/main.seen my_project
./my_project
Local source packages can be declared directly:
[dependencies]
gamekit = { path = "../gamekit" }
For a signed registry, configure its canonical HTTPS origin and use a local alias for each canonical owner/name package identity:
manifest-version = 1
[registries]
default = "https://seen.dev.yousef.codes/packages"
[dependencies]
calc = { package = "alice/mathx", version = "^1.2.0", allow = ["file"] }
[package-grants]
"alice/mathx" = ["file"]
Fetch and lock the dependency graph, then verify reproducible use:
seen pkg fetch
seen check src/main.seen --locked
seen compile src/main.seen my_project --frozen
compile, check, and run prepare declared dependencies automatically. The development origin in this example serves public signed metadata and catalog reads, and the client embeds its official trust root. No submitted release is currently resolver-visible because promotion remains disabled. See Packaging for custom signed registries, lock modes, and capability consent.
cd vscode-seen
npm install
npm run package
code --install-extension seen-*.vsix
The extension provides syntax highlighting, snippets, tasks, and LSP-backed diagnostics/completions through the shipped seen lsp server.
seen lsp
Neovim:
require'lspconfig'.seen.setup{
cmd = {"seen", "lsp"},
filetypes = {"seen"},
root_dir = require'lspconfig.util'.root_pattern("Seen.toml", ".git"),
}
Emacs:
(lsp-register-client
(make-lsp-client :new-connection (lsp-stdio-connection '("seen" "lsp"))
:major-modes '(seen-mode)
:server-id 'seen-lsp))
Arabic hello world:
دالة main() {
println("!مرحبا، سين")
}
Compile with the language flag:
seen compile hello_ar.seen hello --language ar
See Multi-Language Support for translation tables.