{"id":13726252,"url":"https://github.com/oxidizing/sihl","last_synced_at":"2025-04-05T13:07:47.369Z","repository":{"id":37702298,"uuid":"243296942","full_name":"oxidizing/sihl","owner":"oxidizing","description":"A modular functional web framework ","archived":false,"fork":false,"pushed_at":"2024-05-29T13:50:33.000Z","size":7725,"stargazers_count":360,"open_issues_count":45,"forks_count":14,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-29T12:06:16.053Z","etag":null,"topics":["framework","functional-programming","functional-web-development","modular","ocaml","web","web-framework"],"latest_commit_sha":null,"homepage":"https://v3.ocaml.org/p/sihl","language":"OCaml","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/oxidizing.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGES.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}},"created_at":"2020-02-26T15:30:02.000Z","updated_at":"2025-03-23T14:25:49.000Z","dependencies_parsed_at":"2023-02-19T07:31:20.646Z","dependency_job_id":"139a4682-00ef-45be-8d24-4673a6ee5e92","html_url":"https://github.com/oxidizing/sihl","commit_stats":null,"previous_names":[],"tags_count":83,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxidizing%2Fsihl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxidizing%2Fsihl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxidizing%2Fsihl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oxidizing%2Fsihl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oxidizing","download_url":"https://codeload.github.com/oxidizing/sihl/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247339158,"owners_count":20923014,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["framework","functional-programming","functional-web-development","modular","ocaml","web","web-framework"],"created_at":"2024-08-03T01:02:56.966Z","updated_at":"2025-04-05T13:07:47.353Z","avatar_url":"https://github.com/oxidizing.png","language":"OCaml","readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/oxidizing/sihl\"\u003e\n    \u003cimg src=\"images/logo.png\" alt=\"Logo\"\u003e\n  \u003c/a\u003e\n  \u003cp align=\"center\"\u003e\n    A modular and functional web framework\n    \u003cbr /\u003e\n    \u003ca href=\"https://oxidizing.github.io/sihl\"\u003e\n    \u003cstrong\u003eExplore the docs »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/oxidizing/sihl#getting-started\"\u003eGetting Started\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/oxidizing/sihl-demo\"\u003eDemo project\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/oxidizing/sihl/issues\"\u003eReport Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/oxidizing/sihl/issues\"\u003eRequest Feature\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n## Table of Contents\n\n* [About](#about)\n* [Getting Started](#getting-started)\n  * [Prerequisites](#prerequisites)\n  * [Create a project](#create-a-project)\n* [Background](#background)\n* [Documentation](#documentation)\n* [Roadmap](#roadmap)\n* [Contributing](#contributing)\n* [License](#license)\n* [Contact](#contact)\n* [Acknowledgements](#acknowledgements)\n\n## About \n\n*Note that even though Sihl is being used in production, the API is still under active development.*\n\nSihl is a batteries-included web framework built on top of [Opium](https://github.com/rgrinberg/opium), [caqti](https://github.com/paurkedal/ocaml-caqti), [logs](https://erratique.ch/software/logs) and [many more](https://github.com/oxidizing/sihl/blob/master/dune-project). Thanks to the modular architecture, included batteries can be swapped easily. Statically typed functional programming with OCaml makes web development fun and safe.\n\n## Getting Started\n\nCheckout the [getting started](https://oxidizing.github.io/sihl/sihl/index.html#getting-started) section of the documentation.\n\nIf you want to jump into code have a look at the [demo project](https://github.com/oxidizing/sihl-demo). \n\n## Background\n\n### Design Goals\n\nThese are the main design goals of Sihl.\n\n#### Fun\n\nThe overarching goal is to make web development fun. *Fun* is hard to quantify, so let's just say *fun* is maximized when frustration is minimized. This is what the other design goals are here for.\n\n#### Swappable batteries included\n\nSihl should provide high-level features that are common in web applications out-of-the-box. It should provide sane and ergonomic defaults for 80% of the use cases with powerful but not necessarily ergonomic customization options for the other 20%.\n\n#### Ergonomic but safe\n\nOCaml itself ensures a certain level of correctness at compile-time. In order to optimized developer experience, some things are not verified at compile-time but at start-time. Sihl makes sure that your app does not start without the needed configurations and the required environment.\n\n### Features\n\nThese are some of things that Sihl can take care of for you.\n\n- Database handling (pooling, transactions, migrations)\n- Configuration (from env variables to configuration services)\n- Logging\n- User management\n- Token management \n- Session management \n- HTTP routes \u0026 middlewares\n- Flash Messages \n- Authentication\n- Authorization\n- Emailing\n- CLI Commands\n- Job Queue\n- Schedules\n- Block Storage\n\n### Do we need another web framework?\n\nYes, because all other frameworks have not been invented here!\n\nOn a more serious note, originally we wanted to collect a set of services, libraries, best practices and architecture to quickly and sustainably spin-off our own tools and products. \nAn evaluation of languages and tools lead us to build the 5th iteration of what became Sihl with OCaml. We believe OCaml is a phenomenal place to build web apps.\n\nThanks to OCaml, Sihl ...\n\n* ... runs fast \n* ... compiles fast \n* ... is pragmatic and safe\n* ... is fun to use\n\n## Documentation\n\nThe API documentation for the latest version can be found here: https://oxidizing.github.io/sihl\n\n## Ecosystem\n\n- https://github.com/uzh/ask\n\n## Roadmap\n\nOur main goal is to stabilize the service APIs, so updating Sihl in the future becomes easier. We would like to attract contributions for service contributions, once the framework reaches some level of maturity.\n\n## Contributing\n\nCheck out the [Contributing guidelines](/CONTRIBUTING.md).\n\n## License\n\nCopyright (c) 2020 Oxidizing Systems\n\nDistributed under the MIT License. See `LICENSE` for more information.\n\n## Contact\n\nOxidizing Systems - [@oxidizingsys](https://twitter.com/oxidizingsys) - hello@oxidizing.io\n\nProject Link: [https://github.com/oxidizing/sihl](https://github.com/oxidizing/sihl)\n","funding_links":[],"categories":["OCaml"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxidizing%2Fsihl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foxidizing%2Fsihl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foxidizing%2Fsihl/lists"}