{"id":37130526,"url":"https://github.com/nickel-lang/nickel","last_synced_at":"2026-01-20T22:00:55.622Z","repository":{"id":36961340,"uuid":"164738063","full_name":"nickel-lang/nickel","owner":"nickel-lang","description":"Better configuration for less","archived":false,"fork":false,"pushed_at":"2026-01-16T22:25:34.000Z","size":35018,"stargazers_count":2809,"open_issues_count":155,"forks_count":109,"subscribers_count":30,"default_branch":"master","last_synced_at":"2026-01-20T01:58:33.038Z","etag":null,"topics":["configuration","configuration-language","infrastructure","nickel","nix","rust"],"latest_commit_sha":null,"homepage":"https://nickel-lang.org/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nickel-lang.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-01-08T21:43:11.000Z","updated_at":"2026-01-19T07:21:45.000Z","dependencies_parsed_at":"2024-02-19T12:44:30.157Z","dependency_job_id":"979065b2-1773-4b2d-a1ba-dc4ae34d50ab","html_url":"https://github.com/nickel-lang/nickel","commit_stats":{"total_commits":3473,"total_committers":86,"mean_commits":"40.383720930232556","dds":0.6749208177368269,"last_synced_commit":"5145172e7b0035790267cae05aa5a1cc9ef6baf0"},"previous_names":["nickel-lang/nickel","tweag/nickel"],"tags_count":31,"template":false,"template_full_name":null,"purl":"pkg:github/nickel-lang/nickel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickel-lang%2Fnickel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickel-lang%2Fnickel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickel-lang%2Fnickel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickel-lang%2Fnickel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nickel-lang","download_url":"https://codeload.github.com/nickel-lang/nickel/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nickel-lang%2Fnickel/sbom","scorecard":{"id":571476,"data":{"date":"2025-08-11","repo":{"name":"github.com/tweag/nickel","commit":"0809dbc26eefe7118e5e4bc85f681ddaef932c5e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.2,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 17 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/benchmark-master.yaml:1","Warn: no topLevel permission defined: .github/workflows/benchmark-pr.yaml:1","Warn: no topLevel permission defined: .github/workflows/continuous-integration.yml:1","Warn: topLevel 'contents' permission set to 'write': .github/workflows/release-artifacts.yaml:12","Warn: topLevel 'packages' permission set to 'write': .github/workflows/release-artifacts.yaml:13","Info: topLevel 'contents' permission set to 'read': .github/workflows/release-python.yml:17","Warn: no topLevel permission defined: .github/workflows/update-flake-lock.yml:1","Warn: no topLevel permission defined: .github/workflows/upload-pr-benchmarks.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark-master.yaml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/benchmark-master.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark-master.yaml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/benchmark-master.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark-master.yaml:20: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/benchmark-master.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark-pr.yaml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/benchmark-pr.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/benchmark-pr.yaml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/benchmark-pr.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark-pr.yaml:36: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/benchmark-pr.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/benchmark-pr.yaml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/benchmark-pr.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/continuous-integration.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/continuous-integration.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/continuous-integration.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/continuous-integration.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/continuous-integration.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/continuous-integration.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/continuous-integration.yml:66: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/continuous-integration.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-artifacts.yaml:99: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-artifacts.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-artifacts.yaml:122: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-artifacts.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-artifacts.yaml:31: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-artifacts.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-artifacts.yaml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-artifacts.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:84: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-python.yml:92: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:113: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:116: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-python.yml:120: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:126: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:134: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-python.yml:138: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:143: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:160: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-python.yml:165: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:178: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-python.yml:183: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-python.yml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:44: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:59: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release-python.yml:64: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release-python.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/release-python.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/update-flake-lock.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/update-flake-lock.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-flake-lock.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/update-flake-lock.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/update-flake-lock.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/update-flake-lock.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/upload-pr-benchmarks.yaml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/upload-pr-benchmarks.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/upload-pr-benchmarks.yaml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/upload-pr-benchmarks.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/upload-pr-benchmarks.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/upload-pr-benchmarks.yaml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/upload-pr-benchmarks.yaml:37: update your workflow using https://app.stepsecurity.io/secureworkflow/tweag/nickel/upload-pr-benchmarks.yaml/master?enable=pin","Info:   0 out of  27 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of  18 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 1.12.2 not signed: https://api.github.com/repos/tweag/nickel/releases/227614152","Warn: release artifact 1.12.1 not signed: https://api.github.com/repos/tweag/nickel/releases/227371410","Warn: release artifact 1.12.0 not signed: https://api.github.com/repos/tweag/nickel/releases/223123883","Warn: release artifact 1.11.0 not signed: https://api.github.com/repos/tweag/nickel/releases/211831529","Warn: release artifact 1.10.0 not signed: https://api.github.com/repos/tweag/nickel/releases/199617228","Warn: release artifact 1.12.2 does not have provenance: https://api.github.com/repos/tweag/nickel/releases/227614152","Warn: release artifact 1.12.1 does not have provenance: https://api.github.com/repos/tweag/nickel/releases/227371410","Warn: release artifact 1.12.0 does not have provenance: https://api.github.com/repos/tweag/nickel/releases/223123883","Warn: release artifact 1.11.0 does not have provenance: https://api.github.com/repos/tweag/nickel/releases/211831529","Warn: release artifact 1.10.0 does not have provenance: https://api.github.com/repos/tweag/nickel/releases/199617228"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release-artifacts.yaml:16"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: RUSTSEC-2021-0139","Warn: Project is vulnerable to: RUSTSEC-2025-0021 / GHSA-2frx-2596-x5r6","Warn: Project is vulnerable to: RUSTSEC-2024-0320","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-20T16:27:52.989Z","repository_id":36961340,"created_at":"2025-08-20T16:27:52.990Z","updated_at":"2025-08-20T16:27:52.990Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28615540,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T21:52:42.722Z","status":"ssl_error","status_checked_at":"2026-01-20T21:52:20.513Z","response_time":117,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["configuration","configuration-language","infrastructure","nickel","nix","rust"],"created_at":"2026-01-14T15:00:37.680Z","updated_at":"2026-01-20T22:00:55.614Z","avatar_url":"https://github.com/nickel-lang.png","language":"Rust","funding_links":[],"categories":["Programming Languages","Rust"],"sub_categories":[],"readme":"# Nickel\n\n[![Continuous integration](https://github.com/tweag/nickel/workflows/Continuous%20integration/badge.svg)](https://github.com/tweag/nickel/actions?query=branch%3Amaster)\n[![Website](https://img.shields.io/website-up-down-green-red/http/cv.lbesson.qc.to.svg)](https://nickel-lang.org)\n[![Discord](https://img.shields.io/badge/Discord-100000?style=flat\u0026logo=Discord\u0026logoColor=C3C3C3\u0026labelColor=4179DA\u0026color=010101)][discord]\n\nNickel is the universal configuration language. Nickel is configuration\ntemplating, but done right. Modular, correct and concise.\n\nIts purpose is to automate the generation of static configuration files - think\nJSON, YAML, XML, or your favorite data representation language - that are then\nfed to another system. It is designed to have a simple, well-understood core: it\nis in essence JSON with functions.\n\nNickel's salient traits are:\n\n- **Lightweight**: Nickel is easy to embed. An interpreter should be simple to\n    implement. The reference interpreter can be called from many programming\n    languages.\n- **Composable code**: the basic building blocks for computations are functions.\n    They are first-class citizens, which can be passed around, called and\n    composed.\n- **Composable data**: the basic building blocks for data are records (JSON's\n    *objects*). Records can be composed through the merge operator, combining\n    metadata as well (documentation, default values, type contracts, etc).\n- **Typed, but only when it helps**: one one hand, static types improve code\n    quality, serve as documentation and eliminate bugs early, in particular for\n    functions.\n\n    On the other hand, most configuration data are static. In this case, dynamic\n    type errors are often simple and sufficient. Additionally, some JSON schemas\n    are hard to translate to more rigid types.\n\n    Nickel features a *(sound) gradual type system*: it has types, but you get\n    to choose when you want to use them or not. You can statically check complex\n    functions, but use more flexible runtime validation for configuration data.\n- **Design by contract**: *contracts* are a principled approach to validation.\n    In a Nickel configuration, contracts act like *schemas*. You can write your\n    own, mix them with existing contracts, and enforce that your configuration\n    is correct by sprinkling simple type-like annotations.\n\nThe motto guiding Nickel's design is:\n\u003e Great defaults, design for extensibility\n\nThere should be one clear and simple path for common tasks. But the day you need\nto go beyond, there should be no arbitrary restrictions that limit what you can\ndo.\n\n## Who we are\n\nNickel is designed, developed, and maintained by [Tweag](https://www.tweag.io),\na part of  [Modus Create](https://www.moduscreate.com/). We develop it in the\nopen, and gratefully accept community feedback and contributions.\n\n## Use cases\n\nNickel is a good fit in any situation where you need to generate a complex\nconfiguration, be it for a single app, a machine, whole infrastructure, or a\nbuild system.\n\nThe motivating use cases are in particular:\n\n- The [Nix package manager](https://nixos.org/): Nix is a declarative package\n    manager using its own language for specifying packages. Nickel is an\n    evolution of the Nix language, while trying to overcome some of its\n    limitations.\n- Infrastructure as code: infrastructure is becoming increasingly complex,\n    requiring a rigorous approach to deployment, modification and configuration.\n    This is where a declarative approach also shines, as adopted by\n    [Terraform](https://www.terraform.io/),\n    [NixOps](https://github.com/NixOS/nixops) or\n    [Kubernetes](https://kubernetes.io/), all requiring potentially complex\n    generation of configuration.\n- Build systems: build systems (like [Bazel](https://bazel.build/)) need\n    a specification of the dependency graph.\n\nMost aforementioned projects have their own bespoke configuration language. See\n[Comparison](#comparison). In\ngeneral, application-specific languages might suffer from feature creep, lack of\nabstractions or just feel ad hoc. Nickel buys you more for less.\n\n## The Nickel ecosystem\n\nRelated projects that are part of the Nickel ecosystem:\n\n- [nickel-kubernetes](https://github.com/tweag/nickel-kubernetes): a collection\n    of auto-generated Nickel contracts (schemas) for Kubernetes resources.\n- [Terraform-Nickel](https://github.com/tweag/tf-ncl): write Terraform\n    configuration with Nickel\n- [Organist](https://github.com/nickel-lang/organist): batteries included\n    environments with Nickel inside\n- [json-schema-to-nickel](https://github.com/nickel-lang/json-schema-to-nickel):\n    generate Nickel contracts from JSON schema specifications.\n- [rules_nickel](https://github.com/nickel-lang/rules_nickel): generate\n    configuration files using Nickel during a Bazel build\n- The [nickel-lang](https://github.com/nickel-lang) organization hosts various\n    smaller projects, including a tree-sitter grammar definition for Nickel and\n    editor plugins.\n\n## Getting started\n\nPlease follow the getting started guide for Nickel users on the [nickel-lang\nwebsite](https://nickel-lang.org/getting-started). The instructions below are\neither reproduced for this document to be self-contained or because\nthey are aimed toward hacking on the Nickel interpreter itself (e.g. building\nthe `nickel-lang-core` crate documentation).\n\n### Run\n\n1. Get a Nickel binary:\n   - With [flake-enabled](https://nixos.wiki/wiki/Flakes) Nix, run\n     Nickel directly with `nix run nixpkgs#nickel`. You can use [our binary\n     cache](https://tweag-nickel.cachix.org/) to prevent rebuilding a lot of\n     packages. Pass arguments to Nickel with an extra `--` as in `nix run\n     nixpkgs#nickel -- repl`. Use `github:tweag/nickel` to run the unstable\n     version (`master` in practice).\n   - Again with flake-enabled Nix, you can install Nickel in your profile with\n     `nix profile install nixpkgs#nickel`. The `nickel` command is then in your\n     `$PATH` and is available anywhere.\n   - If you're running macOS you can use Homebrew to install the Nickel binary\n     with `brew install nickel`.\n   - Without Nix, you can use `cargo run --bin nickel` after [building](#build),\n     passing arguments with an extra `--` as in\n     `cargo run --bin nickel -- eval program.ncl`.\n\n2. Run your first program:\n\n    ```console\n    $ nickel eval \u003c\u003c\u003c '[\"hello\", \"world\"] |\u003e std.string.join \", \"'\n    \"hello, world\"\n    ```\n\n    Or load it from a file:\n\n    ```console\n    $ echo 'let s = \"world\" in \"hello, %{s}\"' \u003e program.ncl\n    $ nickel eval program.ncl\n    \"hello, world\"\n    ```\n\n3. Start a REPL:\n\n    ```console\n    $ nickel repl\n    nickel\u003e {\"hello\" = true, \"world\" = true, \"universe\" = false}\n      |\u003e std.record.to_array\n      |\u003e std.array.filter (fun {field, value} =\u003e value)\n      |\u003e std.array.map (fun {field, value} =\u003e field)\n      |\u003e std.string.join \", \"\n\n    \"hello, world\"\n    ```\n\n    Use `:help` for a list of available commands.\n4. Export your configuration to JSON, YAML or TOML:\n\n  ```console\n  $ nickel export --format json \u003c\u003c\u003c '{content = \"hello, world\"}'\n  {\n    \"content\": \"hello, world\"\n  }\n  ```\n\nUse `nickel help` for a list of subcommands, and `nickel help \u003csubcommand\u003e`\nfor help about a specific subcommand.\n\nTo get in touch, you can join our\n[![Discord](https://img.shields.io/badge/Discord-100000?style=flat\u0026logo=Discord\u0026logoColor=C3C3C3\u0026labelColor=4179DA\u0026color=010101)][discord]\nserver.\n\n#### Editor Setup\n\nNickel has syntax highlighting plugins for\n[Vim/Neovim](https://github.com/nickel-lang/vim-nickel),\n[Emacs](https://github.com/nickel-lang/nickel-mode) and\n[VSCode](https://marketplace.visualstudio.com/items?itemName=Tweag.vscode-nickel).\nIt also has a [tree-sitter\ngrammar](https://github.com/nickel-lang/tree-sitter-nickel) which provides\nhighlighting in an editor-independent way. The Nickel Language Server (NLS)\nprovides in-editor diagnostics, type hints, and auto-completion. Please follow\n[the LSP guide](https://github.com/tweag/nickel/tree/master/lsp) to set up\nsyntax highlighting and NLS.\n\n#### Formatting\n\nTo format one or several Nickel source files, use `nickel format`:\n\n```console\nnickel format network.ncl container.ncl api.ncl\n```\n\nNickel uses [Topiary](https://github.com/tweag/topiary/) to format Nickel code\nunder the hood. The Nickel Language Server also provides formatting capabilities\nout of the box.\n\n### Build\n\n[rust-guide]: https://doc.rust-lang.org/cargo/getting-started/installation.html\n\n1. Download build dependencies:\n\n   - **With Nix**: If you have [Nix](https://nixos.org/nix) installed:\n\n     ```console\n     nix-shell # if you don't use Nix flakes\n     nix develop # if you use Nix flakes\n     ```\n\n     You will be dropped in a shell, ready to build. You can use\n     [our binary cache](https://tweag-nickel.cachix.org/) to prevent rebuilding\n     a lot of packages.\n   - **Without Nix**: otherwise, follow [this guide][rust-guide] to install Rust\n     and Cargo first.\n\n1. Build Nickel:\n\n   ```console\n   cargo build -p nickel-lang-cli --release\n   ```\n\n   And voilà! Generated files are placed in `target/release`.\n\n   You can directly build and run the Nickel binary and pass argument after `--`\n   by using `cargo run`:\n\n   ```console\n   cargo run --bin nickel --release -- eval foo.ncl\n   ```\n\n### Test\n\nRun tests with\n\n```console\ncargo test\n```\n\n### Documentation\n\nThe user manual is available [on the nickel-lang.org\nwebsite](https://nickel-lang.org/user-manual/introduction), and in this\nrepository as a collection of Markdown files in `doc/manual`.\n\nTo get the documentation of the `nickel-lang` codebase itself:\n\n1. Build the doc:\n\n    ```console\n    cargo doc --no-deps\n    ```\n\n2. Open the file `target/doc/nickel/index.html` in your browser.\n\n### Examples\n\nYou can find examples in the [`./examples`](./examples) directory.\n\n## Current state and roadmap\n\nSince version 1.0 released in May 2023, the core design of the language is\nstable and Nickel is useful for real-world applications. The next steps we plan\nto work on are:\n\nThe next steps we plan to work on are:\n\n- Incremental evaluation: design an incremental evaluation model and a caching\n  mechanism in order to perform fast re-evaluation upon small changes to a\n  configuration.\n- Implement a bytecode compiler and virtual machine\n  ([RFC007](https://github.com/tweag/nickel/blob/master/rfcs/007-bytecode-interpreter.md))\n  for improved performance\n- Custom merge functions (second part of the\n  [overriding\n  proposal](https://github.com/tweag/nickel/blob/9fd6e436c0db8f101d4eb26cf97c4993357a7c38/rfcs/001-overriding.md))\n\n## Comparison\n\n- [CUE](https://cuelang.org/) is a configuration language with a focus on data\n    validation. It introduces a new constraint system backed by a solid theory\n    which ensures strong guarantees about your code. It allows for very elegant\n    schema specifications. In return, the cost to pay is to abandon functions\n    and\n    [Turing-completeness](https://en.wikipedia.org/wiki/Turing_completeness).\n    Nickel's merge system is inspired by the one of CUE, even if since Nickel\n    does have general functions and is Turing-complete, they are necessarily\n    different.\n- [Nix](https://nixos.org/): The Nix language, or *Nix expressions*, is one of\n    the main inspirations for Nickel. It is a very simple yet powerful lazy\n    functional language. We strive to retain this simplicity, while adding\n    typing capabilities, modularity, and detaching the language from the Nix\n    package manager.\n- [Dhall](https://dhall-lang.org/) is a statically typed configuration language.\n    It is also inspired by Nix, to which it adds a powerful static type system.\n    However, this forces the programmer to annotate all of their code with types.\n- [Jsonnet](https://jsonnet.org/) is another language which could be dubbed as\n    \"JSON with functions\" (and others things as well). It is a lazy functional\n    language with object-oriented features, among which inheritance is similar\n    to Nickel's merge system. One big difference with Nickel is the absence of\n    typing.\n- [KCL](https://kcl-lang.io/) is a gradually typed configuration language whose\n    validation is based on object-oriented schemas that can be extended through\n    inheritance. Unlike the languages above, its evaluation is strict.\n- [Pulumi](https://www.pulumi.com/) is not a language in itself, but a cloud\n    tool (like Terraform) where you can use your preferred language for\n    describing your infrastructure. This is a different approach to the problem,\n    with different trade-offs.\n- [Starlark](https://docs.bazel.build/versions/master/skylark/language.html) is\n    the language of [Bazel](https://bazel.build/), which is a dialect of\n    [Python](https://www.python.org/). It does not have types and recursion is\n    forbidden, making it not Turing-complete.\n\nSee [RATIONALE.md](./RATIONALE.md) for the design rationale and a more detailed\ncomparison with these languages.\n\n### Comparison with other configuration languages\n\u003c!-- Intentionally duplicated in `RATIONALE.md`, please update the other one for\nany change done here --\u003e\n\n| Language | Typing                        | Recursion  | Evaluation | Side-effects                                     |\n|----------|-------------------------------|------------|------------|--------------------------------------------------|\n| Nickel   | Gradual (dynamic + static)    | Yes        | Lazy       | Yes (constrained, planned)                       |\n| Starlark | Dynamic                       | No         | Strict     | No                                               |\n| Nix      | Dynamic                       | Yes        | Lazy       | Predefined and specialized to package management |\n| Dhall    | Static (requires annotations) | Restricted | Lazy       | No                                               |\n| CUE      | Static (everything is a type) | No         | Lazy       | No, but allowed in the separated scripting layer |\n| Jsonnet  | Dynamic                       | Yes        | Lazy       | No                                               |\n| KCL      | Gradual (dynamic + static)    | Yes        | Strict     | No                                               |\n| JSON     | None                          | No         | Strict     | No                                               |\n| YAML     | None                          | No         | N/A        | No                                               |\n| TOML     | None                          | No         | N/A        | No                                               |\n\n[discord]: https://discord.gg/vYDnJYBmax\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickel-lang%2Fnickel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnickel-lang%2Fnickel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnickel-lang%2Fnickel/lists"}