Seen projects use Seen.toml for configuration.
[project]
name = "my_project"
version = "0.1.0"
language = "en"
my_project/
├── Seen.toml
├── src/
│ └── main.seen
├── tests/
│ └── test_main.seen
└── benchmarks/
└── bench_main.seen
| Field | Type | Required | Description |
|---|---|---|---|
name |
String | Yes | Project name |
version |
String | Yes | Semantic version (e.g., "1.0.0") |
language |
String | No | Keyword language: en, ar, es, ru, zh, ja (default: en) |
visibility |
String | No | Visibility model: "caps" (capability-based) |
description |
String | No | Project description |
authors |
Array | No | List of author names |
edition |
String | No | Language edition (e.g., "2025") |
modules |
Array | No | Explicit module list |
Example:
[project]
name = "seen_compiler"
version = "1.0.0"
language = "en"
visibility = "caps"
description = "Self-hosted Seen compiler"
authors = ["Seen Language Team"]
edition = "2025"
modules = [
"src/bootstrap",
"src/lexer",
"src/parser",
"src/typechecker",
"src/main.seen",
]
[registries]
default = "https://seen.yousef.codes/packages"
[dependencies]
mathx = "0.1.0"
gamekit = { path = "../gamekit" }
Package dependencies can be either:
"0.1.0"{ path = "../gamekit" }Dependencies are imported by the dependency key:
import mathx.value.{answer}
import gamekit.player.{Player}
Registry packages are installed under .seen/packages/, and registry-backed projects get a Seen.lock recording the resolved package versions and install paths.
[native.dependencies]
sdl3 = { path = "native/lib" }
vulkan = {}
[native.dependencies] controls linker-facing native libraries. For project-local native libraries, add path = "..." to point at the directory containing the library file. The path is resolved relative to the nearest Seen.toml. Seen adds -L<resolved-path> during linking, and on native Linux/macOS builds it also records that directory as a runtime search path so the output can run without extra LIBRARY_PATH or LD_LIBRARY_PATH wrappers.
Legacy system = true entries inside [dependencies] are still accepted for backward compatibility, but new manifests should prefer [native.dependencies].
[build]
targets = ["native", "wasm32", "riscv64"]
optimize = "speed" # "speed" or "size"
lto = true # Link-time optimization
codegen-units = 1 # Single unit for best optimization
debug-info = true # Include debug symbols
profile = "release" # "release" or "debug"
Per-target configuration:
[targets.native]
triple = "x86_64-unknown-linux-gnu"
features = ["simd", "vectorization"]
[targets.riscv64]
triple = "riscv64-unknown-linux-gnu"
features = ["rvv", "compressed", "atomic"]
[targets.wasm32]
triple = "wasm32-unknown-unknown"
features = ["simd128"]
Code formatting preferences:
[format]
line-width = 100
indent = 4
trailing-comma = true
document-types = [".seen", ".md", ".toml"]
[test]
threads = "auto" # number of test threads
timeout = 300 # seconds per test
coverage = true # enable code coverage
[benchmark]
iterations = 1000
warmup = 100
timeout = 60
statistical-significance = 0.05
Language server features:
[lsp]
diagnostics = true
completion = true
hover = true
goto-definition = true
find-references = true
semantic-tokens = true
Performance targets (informational):
[performance]
lexer-throughput = "25M tokens/sec"
parser-throughput = "800K lines/sec"
typechecker-speed = "80μs/function"
codegen-speed = "300μs/function"
memory-overhead = "10%"
