{"id":47613079,"url":"https://github.com/anzellai/sky","last_synced_at":"2026-05-30T23:00:49.711Z","repository":{"id":345769251,"uuid":"1178160193","full_name":"anzellai/sky","owner":"anzellai","description":"Sky — an Elm-inspired language that compiles to Go. Hindley-Milner types, server-driven UI (Sky.Live), single binary output.","archived":false,"fork":false,"pushed_at":"2026-05-27T15:13:20.000Z","size":251886,"stargazers_count":410,"open_issues_count":2,"forks_count":8,"subscribers_count":5,"default_branch":"main","last_synced_at":"2026-05-27T15:28:33.130Z","etag":null,"topics":["compiler","compiles-to-go","elm-inspired","fullstack","functional-programming","go","liveview","lsp","programming-language","server-driven-ui","sky-language","sse","type-inference","typescript"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anzellai.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE.md","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-10T18:45:31.000Z","updated_at":"2026-05-27T15:13:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"3e808c30-4077-40d6-bb82-fd66071948ae","html_url":"https://github.com/anzellai/sky","commit_stats":null,"previous_names":["anzellai/sky"],"tags_count":157,"template":false,"template_full_name":null,"purl":"pkg:github/anzellai/sky","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anzellai%2Fsky","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anzellai%2Fsky/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anzellai%2Fsky/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anzellai%2Fsky/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anzellai","download_url":"https://codeload.github.com/anzellai/sky/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anzellai%2Fsky/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33712579,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-30T02:00:06.278Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["compiler","compiles-to-go","elm-inspired","fullstack","functional-programming","go","liveview","lsp","programming-language","server-driven-ui","sky-language","sse","type-inference","typescript"],"created_at":"2026-04-01T20:48:57.737Z","updated_at":"2026-05-30T23:00:49.684Z","avatar_url":"https://github.com/anzellai.png","language":"Go","funding_links":[],"categories":["Go"],"sub_categories":[],"readme":"# Sky\n\n[sky-lang.org](https://sky-lang.org) · [Examples](examples/) · [Docs](docs/)\n\n\u003e **Experimental** — Sky is an opinionated, AI-friendly programming language under active development. APIs and internals may change between minor versions.\n\nSky is a fullstack programming language that combines **Go's pragmatism** with the **elegance of pure-functional, ML-family languages**. Write functional, strongly-typed code with a batteries-included stdlib — `Sky.Live` for server-driven UI, `Sky.Tui` for terminal UI (sharing the same `Std.Ui` code), `Std.Db` for SQL persistence, `Std.Auth` for sessions, `Sky.Core.Error` for unified error handling — import any Go package with auto-generated FFI bindings (no hand-written glue), and ship a single portable binary. Sky's explicit types, exhaustive pattern matching, and strict `Task` effect boundary make it **AI-friendly by design**: both humans and LLMs tend to write code that compiles the first time.\n\n```elm\nmodule Main exposing (main)\n\nimport Std.Log exposing (println)\n\nmain =\n    println \"Hello from Sky!\"\n```\n\n## Current state (v0.15.x)\n\n- **Type-directed lowering throughout (v0.15).** Sub-expressions at\n  lambda bodies, record-field inits, list elements, and call args\n  lower with the slot's typed Go form propagated. Closes the long-\n  standing parametric-record-alias bug class (callback fields keep\n  their typed callee parameter; cross-alias passing works without\n  the alias-chain workaround; inline lambdas in record fields keep\n  their typed shape). Architecture write-up:\n  [docs/v1-rfc/type-soundness-deep-analysis.md](docs/v1-rfc/type-soundness-deep-analysis.md).\n- **Go generics on parametric record aliases (v0.15).** A\n  `type alias Cfg msg = { onSubmit : msg, label : String, ... }` now\n  emits `type Cfg_R[T1 any] struct { OnSubmit T1; Label string; ... }`\n  with per-instance type args. Stripe-SDK-scale benchmark\n  (`examples/13-skyshop`, 76 k FFI symbols) still tree-shakes\n  `main.go` 14 k → 4 k lines (−71 %) and `stripe_bindings.go`\n  326 k → 58 k lines (−82 %).\n- **Same-module polymorphic re-instantiation (v0.15).** Annotated\n  `f : Cfg msg -\u003e msg` called with `msg=Int` AND `msg=Bool` in the\n  same module both work — sibling references alpha-rename per call\n  site. Wildcard-`any` sigs stay on the shared-env path so body ↔\n  caller unification chains keep soundness.\n- **Layer 3 stdlib — every kernel module is Sky source** (carried\n  forward from v0.14). Browse via\n  `sky-stdlib/{Sky/Core,Std,Sky/Http}/*.sky`, or `sky doc --serve`\n  for a browsable HTTP doc server with type-signature search\n  (Hoogle-style), in-module symbol filter, and Markdown rendering.\n- **Auto-TCO.** Every Sky function with tail-position self-recursion\n  compiles to a `for { ... continue }` Go loop. Constant Go stack\n  regardless of input size. Applies to user code, not just stdlib.\n- **Sky Console + sub-app mount + observability federation.** Every\n  Sky.Live / Sky.Http.Server app auto-mounts a Std.Ui dashboard at\n  `/_sky/console` in dev mode. Prometheus metrics at `/_sky/metrics`\n  (Bearer-gated in production). `rt.MountSubApp` hosts any Sky binary\n  (or any HTTP server) under any URL prefix; logs / metrics / spans\n  push back to the parent for one-scrape observability across the\n  tree.\n- **LSP, dev tooling.** Hover + goto-def for every USED symbol class.\n  `sky watch` (file-watch rebuild + restart with sticky-on-error\n  policy), `sky doctor` (project + env health checks), `sky console`\n  (standalone Std.Ui dashboard — Live or Tui backend).\n- **27 example projects** covering CLI, Sky.Tui, Sky.Live + Sky.Http\n  apps, databases (SQLite / PostgreSQL / Firestore), payments\n  (Stripe), auth, GUI (Fyne), a Reddit/HN-style forum, and a\n  visual-regression Std.Ui showcase.\n\n## What Sky brings together\n\n- **Go compilation target** — fast builds, single static binary,\n  access to the full Go ecosystem (databases, HTTP servers, cloud\n  SDKs).\n- **Pure-functional ML-family front-end** — Hindley-Milner type\n  inference, algebraic data types, exhaustive pattern matching, pure\n  functions, model/update/view/subscriptions architecture (TEA).\n- **Server-driven UI** — DOM diffing, SSE subscriptions, session\n  management on the server. No client-side framework. (Same\n  architectural style popularised by Phoenix LiveView; design +\n  implementation independent.)\n\nSky compiles to Go. One binary runs your API, DB access, and\nserver-rendered interactive UI — one codebase, one language, one\ndeployment artifact.\n\n\u003e Sky's surface syntax is deliberately compatible with the Elm language\n\u003e (BSD-3-Clause, © Evan Czaplicki and contributors) and several files\n\u003e in the type-inference core are derivative works adapted from\n\u003e elm/compiler. Full attribution + licence text in [NOTICE.md](NOTICE.md).\n\n## Implementation\n\nThe compiler is in **Haskell** (GHC 9.4+). Single `sky` binary. Runtime\nin Go (`runtime-go/rt/`), embedded into the binary via Template\nHaskell — no separate install. See\n[docs/compiler/journey.md](docs/compiler/journey.md) for the TS → Go →\nself-hosted Sky → Haskell history.\n\n## What's in the box\n\nSix killer modules cover the common needs of any modern web app — no\nplugins, no separate services, no `npm install`.\n\n### Sky.Live — server-driven UI\n\n```elm\ntype Msg = Increment | Decrement\n\nupdate msg model =\n    case msg of\n        Increment -\u003e ( { model | count = model.count + 1 }, Cmd.none )\n        Decrement -\u003e ( { model | count = model.count - 1 }, Cmd.none )\n\nview model =\n    div []\n        [ button [ onClick Increment ] [ text \"+\" ]\n        , span [] [ text (String.fromInt model.count) ]\n        , button [ onClick Decrement ] [ text \"-\" ]\n        ]\n```\n\nFull TEA loop (`init / update / view / subscriptions`), async work via\n`Cmd.perform`, persistent sessions across deploys (memory / SQLite /\nRedis / Postgres / Firestore), input-authority protocol that protects\nthe user's typed value across re-renders, reverse-proxy-hardened SSE\nwith auto-reconnect + retry queue. See\n[Sky.Live overview](docs/skylive/overview.md).\n\n### Std.Ui — typed no-CSS layout DSL\n\n```elm\nimport Std.Ui as Ui\nimport Std.Ui.Background as Background\nimport Std.Ui.Font as Font\n\nview model =\n    Ui.layout []\n        (Ui.row\n            [ Ui.spacing 12, Ui.padding 16, Background.color (Ui.rgb 255 102 0) ]\n            [ Ui.button [] { onPress = Just Decrement, label = Ui.text \"−\" }\n            , Ui.el [ Font.size 24, Font.bold ] (Ui.text (String.fromInt model.count))\n            , Ui.button [] { onPress = Just Increment, label = Ui.text \"+\" }\n            ])\n```\n\nBuild a UI from typed primitives (`row`, `column`, `el`, `paragraph`,\n`textColumn`, `link`, `image`, `button`, `input`, `form`, `html`) and\ntyped attributes from focused sub-modules (`Background.color`,\n`Border.rounded`, `Font.size`, `Region.heading`, …). Renders to\ninline-styled HTML with semantic tags dispatched from `Region.*`\n(`\u003ch1..h6\u003e`, `\u003cmain\u003e`, `\u003cnav\u003e`, `\u003caside\u003e`, `\u003cfooter\u003e`). Forms with the\npassword best-practice pattern (`Ui.form` + `Ui.onSubmit` decoding\nformData into a typed record — secret never enters Model). File /\nimage upload with browser-side resize hints. Same source code runs in\nboth `Sky.Live` (browser) and `Sky.Tui` (terminal — see below). See\n[Sky.Ui overview](docs/skyui/overview.md). Prior-art attribution:\n[NOTICE.md](NOTICE.md).\n\n### Sky.Tui — terminal UI with the same Std.Ui code\n\n```elm\n-- shared.sky — both Live and Tui share this view + update\nview model =\n    Ui.column [ Ui.spacing 8, Ui.padding 16 ]\n        [ Ui.el [ Font.bold, Font.size 24 ] (Ui.text (String.fromInt model.count))\n        , Ui.row [ Ui.spacing 4 ]\n            [ Ui.button [] { onPress = Just Decrement, label = Ui.text \"−\" }\n            , Ui.button [] { onPress = Just Increment, label = Ui.text \"+\" }\n            ]\n        ]\n```\n\n```elm\n-- Main.sky (web)             -- MainTui.sky (terminal)\nmain = Live.app cfg            main = Tui.app cfg |\u003e Task.run\n```\n\nSame `update` semantics, same `view` widgets, two completely different\noutput targets. Sky.Tui handles bracketed paste, wide chars (CJK +\nemoji + ZWJ), focus rings, scroll wheel, mouse press, viewport pixel\ncanvas (1280×720 logical px maps to cells), resize via SIGWINCH. See\n[Sky.Tui overview](docs/skytui/overview.md) and\n[examples/22-tui-stopwatch-ui](examples/22-tui-stopwatch-ui) for a\nstopwatch in \u003c100 lines that runs in both backends.\n\n### Std.Auth — authentication, in the box\n\n```elm\nAuth.register db \"alice@example.com\" password\n    |\u003e Task.andThenResult (\\uid -\u003e\n        Auth.signToken secret (Dict.fromList [(\"sub\", String.fromInt uid)]) 86400)\n```\n\nbcrypt password hashing, HMAC-SHA256 JWTs, plus optional DB-backed\n`register` / `login` / `setRole`. Minimum-32-byte secret enforcement,\nconstant-time compare, configurable cost. See\n[Std.Auth overview](docs/skyauth/overview.md).\n\n### Std.Db — one API for SQLite + PostgreSQL\n\n```elm\nDb.withTransaction db (\\tx -\u003e\n    Db.exec tx \"UPDATE accounts SET balance = balance - ? WHERE id = ?\" [amount, fromId]\n        |\u003e Task.andThen (\\_ -\u003e\n            Db.exec tx \"UPDATE accounts SET balance = balance + ? WHERE id = ?\" [amount, toId]))\n```\n\nParameter-safe queries, transactions, conventional CRUD helpers\n(`insertRow` / `getById` / `updateById` / `deleteById` /\n`findOneByField` / `findManyByField` / `findByConditions`). Switch\ndriver in `sky.toml`; never touch it again in your code. See\n[Std.Db overview](docs/skydb/overview.md).\n\n### Sky Console + observability + sub-app mount\n\nEvery Sky.Live / Sky.Http.Server app ships with:\n\n| Surface | What it is |\n|---|---|\n| `🔍 Console` link | Floating bottom-right anchor injected into every dev-mode page. Same-origin link to `/_sky/console`. |\n| `/_sky/console` | Bundled Std.Ui dashboard reverse-proxied behind your app. Tabs: Overview · Metrics · Logs · Traces · Errors. Auto-aggregates everything from your app + every mounted sub-app. |\n| `/_sky/metrics` | Prometheus scrape endpoint (Bearer-gated in production). `sky_live_requests_total{route,status}`, `sky_live_request_seconds`, custom counters via `rt.RecordCounter`. |\n| `/_sky/healthz` / `/_sky/readyz` / `/_sky/buildinfo` | k8s / Cloud Run probes + build metadata. |\n| Structured logs | `Log.info` / `.warn` / `.error` / `.infoWith` with level + message + request-correlation ID; HTTP access log automatic. |\n| Trace spans | Every HTTP request opens a span; `rt.RecordTrace` adds children. Exports to OpenTelemetry if `OTEL_EXPORTER_OTLP_ENDPOINT` is set. |\n\n**Sub-app mount** — host multiple Sky apps under one binary, with\nfederated observability:\n\n```go\n// Inside your parent Sky app's generated main.go\nrt.MountSubApp(mux, \"/billing\", rt.SpawnBinary(\"./billing-app\"))\nrt.MountSubApp(mux, \"/admin\",   rt.SpawnBinary(\"./admin-app\"))\nrt.MountSubApp(mux, \"/docs\",    rt.SpawnBinary(\"./hugo-server\"))\n```\n\nEach sub-app runs as its own child process — own session store, own\nupdate loop, own cookies, zero shared state. The reverse proxy gives\nthe user a single port and origin. **Observability federates\nautomatically**: every log / metric / span the child emits gets pushed\nback to the parent labelled `subapp=\"billing\"`, so one Prometheus\nscrape on the parent covers the whole tree.\n\n```bash\nsky run                      # dev — console, banner, logs/metrics on\nENV=production sky-out/app   # prod — console gone, /_sky/metrics behind Bearer auth\n```\n\n### Std.Decimal + Std.Money + Std.Time — production-grade arithmetic + time\n\n```elm\n-- Exact arithmetic — 0.1 + 0.2 = 0.3 genuinely\ntotal = Dec.add (Dec.fromString \"0.1\" |\u003e okOr Dec.zero)\n                (Dec.fromString \"0.2\" |\u003e okOr Dec.zero)\n\n-- Currency-typed Money — USD vs JPY rejected at compile time\nsubTotal = Money.fromMajor Money.USD 100\ntax      = Money.percentOf (Dec.fromString \"8.875\" |\u003e okOr Dec.zero) subTotal\ntotal    = Money.add subTotal tax       -- \"$108.88\"\n\n-- Fair-split invoice — sums to $100 exactly\nparts = Money.allocate 3 (Money.fromMajor Money.USD 100)\n        -- → [$33.34, $33.33, $33.33]\n\n-- Timezone-aware (no /usr/share/zoneinfo needed; embedded tzdata)\nnextMonth = Stime.addMonths 1 today    -- Jan 31 + 1 → Feb 28/29 clamped\n```\n\n`Decimal` backed by `shopspring/decimal`; `Money` enforces currency-\nmatch at the type level; `Std.Time` ships embedded `time/tzdata`. ISO\n4217 enum covers 50+ codes + crypto (BTC, ETH, USDT, USDC). Full\nsurface: [Standard library reference](docs/stdlib.md).\n\n## Quick start\n\n```bash\n# macOS / Linux — single-binary install\ncurl -fsSL https://raw.githubusercontent.com/anzellai/sky/main/install.sh | sh\n\n# or with Docker\ndocker run --rm -v $(pwd):/app -w /app anzel/sky sky --help\n```\n\n\u003e **Prerequisite:** [Go](https://go.dev) 1.21+ — Sky compiles to Go.\n\n```bash\nsky init hello\ncd hello\nsky run src/Main.sky                  # build + run\nsky watch src/Main.sky                # rebuild + restart on save\nsky doc --serve                       # browsable API docs (any browser)\nsky doctor                            # health checks\n```\n\nSee [docs/getting-started.md](docs/getting-started.md) for a\nwalkthrough.\n\n## Going to production\n\nTwo things flip Sky from dev to production: a config block in\n`sky.toml` and a small set of env vars. Both read at process start —\nno rebuild needed.\n\n### `sky.toml` (compiled defaults — checked into your repo)\n\n```toml\n[live]\nport         = 8000         # default if SKY_LIVE_PORT not set\nstore        = \"postgres\"   # memory | sqlite | redis | postgres | firestore\nttl          = \"24h\"\nmaxBodyBytes = 5242880      # 5 MiB cap on /_sky/event POST\n\n[log]\nformat = \"json\"             # plain (dev default) | json (prod default)\nlevel  = \"info\"\n\n[auth]\ntokenTtl       = \"24h\"\ncookie         = \"sky_sid\"\n# tokenSecret read from SKY_AUTH_TOKEN_SECRET (never put secrets in sky.toml)\n```\n\n### `.env` / process env (deploy-time secrets + per-env overrides)\n\n```dotenv\nENV=production              # gates dev console + banner OFF; /_sky/metrics behind auth\nSKY_LIVE_PORT=8080          # or honour PORT (Cloud Run / Fly / Heroku)\nSKY_LIVE_STORE=postgres\nDATABASE_URL=postgres://…   # fallback when SKY_LIVE_STORE_PATH unset\nSKY_AUTH_TOKEN_SECRET=…     # ≥32 bytes; Sky errors at startup if shorter\nSKY_LOG_FORMAT=json\nSKY_LOG_LEVEL=info\nSKY_ADMIN_TOKEN=…           # /_sky/metrics + /_sky/console require Bearer in prod\n                            # (legacy: SKY_METRICS_TOKEN / SKY_CONSOLE_TOKEN_SECRET still honoured)\n# OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318\n```\n\nPrecedence: **process env \u003e `.env` \u003e `sky.toml`**. The `.env` file is\nauto-loaded but never overrides real env vars — so a `docker run -e\nENV=production` always wins.\n\nThe `productionFromEnv()` gate (`ENV` then `SKY_ENV`, anything outside\n`{dev, development, local}` counts as production) governs three things:\ndev console mount, `🔍 Console` banner, `/_sky/metrics` auth. One env\nvar, one switch.\n\nReference: [Sky.Live overview — env precedence](docs/skylive/overview.md#environment-variable-precedence).\n\n### Building from source\n\n```bash\n# easiest path on any system with nix\nnix develop                # GHC 9.4.8 + Go + system deps, sandboxed\n./scripts/build.sh --clean\n```\n\nSee [docs/development.md](docs/development.md) for the full build +\ntest story (pinned toolchain, reproducible Nix builds, contributor\nguide).\n\n## Documentation\n\n| Area | Link |\n|---|---|\n| Getting started | [docs/getting-started.md](docs/getting-started.md) |\n| `sky.toml` reference | [docs/sky-toml.md](docs/sky-toml.md) |\n| Language syntax | [docs/language/syntax.md](docs/language/syntax.md) |\n| Types | [docs/language/types.md](docs/language/types.md) |\n| Pattern matching | [docs/language/pattern-matching.md](docs/language/pattern-matching.md) |\n| Modules | [docs/language/modules.md](docs/language/modules.md) |\n| Go FFI interop | [docs/ffi/go-interop.md](docs/ffi/go-interop.md) |\n| FFI design | [docs/ffi/ffi-design.md](docs/ffi/ffi-design.md) |\n| Error system | [docs/errors/error-system.md](docs/errors/error-system.md) |\n| **Standard library reference** | [docs/stdlib.md](docs/stdlib.md) |\n| **Std.Auth overview** | [docs/skyauth/overview.md](docs/skyauth/overview.md) |\n| **Std.Db overview** | [docs/skydb/overview.md](docs/skydb/overview.md) |\n| Sky.Live overview | [docs/skylive/overview.md](docs/skylive/overview.md) |\n| Sky.Live architecture | [docs/skylive/architecture.md](docs/skylive/architecture.md) |\n| Std.Ui overview | [docs/skyui/overview.md](docs/skyui/overview.md) |\n| Sky.Tui overview | [docs/skytui/overview.md](docs/skytui/overview.md) |\n| Compiler architecture | [docs/compiler/architecture.md](docs/compiler/architecture.md) |\n| Compiler pipeline | [docs/compiler/pipeline.md](docs/compiler/pipeline.md) |\n| Compiler journey (TS → Go → Sky → Haskell) | [docs/compiler/journey.md](docs/compiler/journey.md) |\n| CLI reference | [docs/tooling/cli.md](docs/tooling/cli.md) |\n| Testing (`sky test`) | [docs/tooling/testing.md](docs/tooling/testing.md) |\n| LSP | [docs/tooling/lsp.md](docs/tooling/lsp.md) |\n| Known limitations | [docs/KNOWN_LIMITATIONS.md](docs/KNOWN_LIMITATIONS.md) |\n| Development \u0026 contributing | [docs/development.md](docs/development.md) |\n\n## Status\n\n- **Core principle: \"if it compiles, it works.\"** Every known runtime\n  panic class has a regression test in `runtime-go/rt/*_test.go` or\n  `test/Sky/**Spec.hs`. Defence in depth (panic recovery + `Err`-\n  return at Task boundaries) is the floor.\n- **27 example projects** under `examples/` — clean build from a wiped\n  slate is a release gate.\n- **`sky verify`** is the canonical runtime check: builds AND runs each\n  example, hits HTTP endpoints, honours per-example `verify.json`\n  scenarios.\n- **Test matrix** — 306 cabal hspec specs + 25+ runtime Go tests +\n  70-file `test-files/*.sky` self-test loop + format idempotency +\n  Playwright browser sweep across every Sky.Live / Sky.Http.Server\n  example.\n- **FFI generation** — Stripe SDK (8 896 types), Firestore, Fyne, and\n  others auto-bind.\n\n## Contributing\n\nIssues + PRs welcome. See the docs tree for architecture context\nbefore opening a structural PR.\n\n## Licence\n\n[Apache 2.0](LICENSE) — © 2025–2026 Anzel Lai. Includes patent grant +\ntrademark clause. Prior-art attribution for derivative files (parts of\nthe type-inference core adapted from elm/compiler under BSD-3-Clause)\nlives in [NOTICE.md](NOTICE.md). Contributions accepted under the same\nApache 2.0 terms — see [CONTRIBUTING.md](CONTRIBUTING.md).\n\n\u003e Sky was previously distributed under the MIT licence (releases up to\n\u003e and including v0.10.0). Those releases remain available under their\n\u003e original MIT terms; v0.10.1 onwards ships under Apache 2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanzellai%2Fsky","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanzellai%2Fsky","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanzellai%2Fsky/lists"}