{"id":39584757,"url":"https://github.com/Qovery/Torii","last_synced_at":"2026-01-26T15:01:21.235Z","repository":{"id":210993163,"uuid":"726619039","full_name":"Qovery/Torii","owner":"Qovery","description":"Torii ⛩️ is a simple, powerful and extensible open-source Internal Developer Portal","archived":true,"fork":false,"pushed_at":"2024-07-25T18:54:23.000Z","size":1125,"stargazers_count":178,"open_issues_count":8,"forks_count":9,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-11-16T23:27:18.384Z","etag":null,"topics":["developer-experience","developer-tool","devops","internal-developer-portal","platform-engineering"],"latest_commit_sha":null,"homepage":"https://qovery.github.io/Torii/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Qovery.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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}},"created_at":"2023-12-02T22:12:28.000Z","updated_at":"2025-11-15T08:22:06.000Z","dependencies_parsed_at":"2023-12-14T11:57:49.926Z","dependency_job_id":"8f900bed-b19a-40c5-9f79-f850aeee5caf","html_url":"https://github.com/Qovery/Torii","commit_stats":null,"previous_names":["qovery/portal","qovery/torii"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Qovery/Torii","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qovery%2FTorii","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qovery%2FTorii/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qovery%2FTorii/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qovery%2FTorii/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Qovery","download_url":"https://codeload.github.com/Qovery/Torii/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Qovery%2FTorii/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28781308,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-26T13:55:28.044Z","status":"ssl_error","status_checked_at":"2026-01-26T13:55:26.068Z","response_time":59,"last_error":"SSL_read: 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":["developer-experience","developer-tool","devops","internal-developer-portal","platform-engineering"],"created_at":"2026-01-18T07:35:27.100Z","updated_at":"2026-01-26T15:01:21.225Z","avatar_url":"https://github.com/Qovery.png","language":"TypeScript","readme":"# Torii ⛩️\n\nTorii is a simple, powerful and extensible open-source Internal Developer Portal where developers can find all the tools and\nservices they need to build, deploy, and manage their applications.\n\nTorii focus on three principles:\n\n- **Easily configurable**: Platform Engineers can easily define a catalog of tools and services available to developers. They can also\n  define a scorecard and a workflow for each tool and service.\n- **Easily usable**: Developers can easily find and use the tools and services they need to build, deploy, and manage their applications via\n  a simple web interface.\n- **Easily extensible**: Platform Engineers can easily extend Torii by adding new tools and services to the catalog.\n\nThat's it!\n\n\u003e ⚠️ Torii is in active development and not ready for production yet.\n\u003e But contributions are appreciated.\n\n## Features\n\n| Feature          | Status              |\n|------------------|---------------------|\n| Self Service     | WIP                 |\n| Catalog Services | WIP                 |\n| Auth             | Not implemented yet |\n| Audit            | Not implemented yet |\n\n## Getting Started\n\n### Prerequisites\n\n- MacOSX / Linux / Windows\n- Postgres\n\n### Installation\n\nToday you can run Torii using Docker Compose. In the future, we will provide a Helm chart to deploy Torii on Kubernetes.\n\n```bash\ndocker-compose up\n```\n\nIf you want to run it locally you will need to start Postgres DB, the backend and the frontend separately.\n\n```bash\n# Start Postgres\ndocker-compose -f docker-compose-dev.yaml up\n```\n\n```bash\n# Start the backend\ncd backend\n# you need to install Cargo (Rust) if you don't have it\ncargo run -- --config examples/config.yaml\n```\n\nWhen starting the backend - you should see the following output:\n\n```bash\n████████╗ ██████╗ ██████╗ ██╗██╗\n╚══██╔══╝██╔═══██╗██╔══██╗██║██║\n   ██║   ██║   ██║██████╔╝██║██║\n   ██║   ██║   ██║██╔══██╗██║██║\n   ██║   ╚██████╔╝██║  ██║██║██║\n   ╚═╝    ╚═════╝ ╚═╝  ╚═╝╚═╝╚═╝\n\n2024-04-14T17:38:07.667049Z  INFO backend: connecting to database...\n2024-04-14T17:38:07.756951Z  INFO backend: database initialized and up to date\n2024-04-14T17:38:07.757015Z  INFO backend: -\u003e self-service section 'empty-section' loaded\n2024-04-14T17:38:07.757021Z  INFO backend: -\u003e self-service section 'default' loaded\n2024-04-14T17:38:07.757026Z  INFO backend:      |-\u003e action 'new-testing-environment' loaded\n2024-04-14T17:38:07.757033Z  INFO backend:      |-\u003e action 'stop-testing-environment' loaded\n2024-04-14T17:38:07.758885Z  INFO backend: Server listening on 0.0.0.0:9999\n```\n\n```bash\n# Start the frontend\ncd frontend\nnpm install\nnpm run dev\n```\n\nYou can now access:\n\n- the frontend at `http://localhost:3000`\n- the backend at `http://localhost:9999`\n\n## Configuration\n\n### Simple Configuration\n\nTorii is configured with a YAML file that contains the self-service sections.\nA self-service section is a group of actions that developers can use to interact with tools and services.\n\nHere is an example of a simple configuration that will create a self-service section with a single action to create a new testing\nenvironment:\n\n```yaml\nself_service:\n  sections:\n    - slug: default\n      name: Default\n      description: Default section\n      actions:\n        - slug: new-testing-environment\n          name: New Testing Environment\n          description: spin up a temporary testing environment\n          icon: target\n          fields:\n            - slug: name\n              title: Name\n              description: provide a name for your environment\n              placeholder: testing-123\n              type: text\n              default: testing-123\n              required: true\n            - slug: description\n              title: Description\n              description: provide a description for your environment - what's good for?\n              type: textarea\n            - slug: ttl\n              title: TTL\n              description: Time to live for your environment (in hours)\n              placeholder: 24\n              type: number\n              required: true\n            - slug: seed\n              title: Seed\n              description: Do you want to seed your environment with some data?\n              type: boolean\n              default: true\n          post_validate:\n            - command:\n                - python\n                - my-scripts/environment_management.py\n                - create\n                - --name\n                - {{name}} # this is a variable that will be replaced by the value of the field 'name'\n          delayed_command:\n            - command:\n                - python\n                - my-scripts/environment_management.py\n                - delete\n                - --name\n                - {{name}}\n              delay:\n                hours: {{ttl}} # this is a variable that will be replaced by the value of the field 'ttl'\n```\n\nIn this example, we define a self-service section with a single action called `new-testing-environment`. This action has four fields:\n\n- `name`: a text field that is required\n- `description`: a textarea field\n- `ttl`: a number field that is required\n- `seed`: a boolean field with a default value of `true`\n\nWhen the developer fills the form and submits it, Torii will run the `post_validate` script.\nIf the script exits with a non-zero exit code, the action will fail.\nIf the script exits with a zero exit code, Torii will run the `delayed_command` script after the specified delay.\n\n[//]: # (### Advanced Configuration)\n\n[//]: # ()\n\n[//]: # (#### Autocomplete Fetcher)\n\n[//]: # ()\n\n[//]: # (An autocomplete fetcher is a script that must print a JSON on standard output. The JSON must contain a `results` key that contains a list of)\n\n[//]: # (values.)\n\n[//]: # ()\n\n[//]: # (```json)\n\n[//]: # ({)\n\n[//]: # (  \"results\": [)\n\n[//]: # (    \"val 1\",)\n\n[//]: # (    \"val 2\",)\n\n[//]: # (    \"val 3\")\n\n[//]: # (  ])\n\n[//]: # (})\n\n[//]: # (```)\n\n[//]: # ()\n\n[//]: # (Example of autocomplete fetcher in python:)\n\n[//]: # ()\n\n[//]: # (```python)\n\n[//]: # (import json)\n\n[//]: # ()\n\n[//]: # ()\n\n[//]: # (def get_data_from_fake_api\u0026#40;\u0026#41;:)\n\n[//]: # (    return [)\n\n[//]: # (        'val 1',)\n\n[//]: # (        'val 2',)\n\n[//]: # (        'val 3',)\n\n[//]: # (    ])\n\n[//]: # ()\n\n[//]: # ()\n\n[//]: # (if __name__ == '__main__':)\n\n[//]: # (    # do your stuff here)\n\n[//]: # (    results = get_data_from_fake_api\u0026#40;\u0026#41;)\n\n[//]: # ()\n\n[//]: # (    data = {'results': results})\n\n[//]: # ()\n\n[//]: # (    # print json on standard output)\n\n[//]: # (    print\u0026#40;json.dumps\u0026#40;data\u0026#41;\u0026#41;)\n\n[//]: # (```)\n\n[//]: # ()\n\n[//]: # (#### Validation Script)\n\n[//]: # ()\n\n[//]: # (A validation script can be any kind of script. It can be a bash script, a python script, a terraform script, etc. The script must exit with)\n\n[//]: # (a non-zero exit code if the validation fails.)\n\n[//]: # ()\n\n[//]: # (```bash)\n\n[//]: # (#!/bin/bash)\n\n[//]: # ()\n\n[//]: # (set -e # exit on error)\n\n[//]: # (# print error on standard error output)\n\n[//]: # ()\n\n[//]: # (# do your stuff here)\n\n[//]: # (exit 0)\n\n[//]: # (```)\n\n[//]: # ()\n\n[//]: # (#### Post Validation Script)\n\n[//]: # ()\n\n[//]: # (An post validation script can be any kind of script. It can be a bash script, a python script, a terraform script, etc.)\n\n[//]: # ()\n\n[//]: # (- The script must exit with a non-zero exit code if the validation fails.)\n\n[//]: # (- The script must be idempotent. It can be executed multiple times without side effects.)\n\n[//]: # (- The output of the script must be a JSON that contains the defined model keys with their values. \u0026#40;Torii will update the model with)\n\n[//]: # (  the values returned by the script\u0026#41;)\n\n[//]: # ()\n\n[//]: # (```json)\n\n[//]: # ({)\n\n[//]: # (  \"status\": \"success\",)\n\n[//]: # (  \"url\": \"https://my-service.com\",)\n\n[//]: # (  \"username\": \"my-username\",)\n\n[//]: # (  \"password\": \"my-password\")\n\n[//]: # (})\n\n[//]: # (```)\n\n[//]: # ()\n\n[//]: # (```bash)\n\n[//]: # (#!/bin/bash)\n\n[//]: # ()\n\n[//]: # (set -e # exit on error)\n\n[//]: # (# print error on standard error output)\n\n[//]: # ()\n\n[//]: # (# do your stuff here)\n\n[//]: # (exit 0)\n\n[//]: # (```)\n\n## Design\n\nPlease refer to the [DESIGN.md](./DESIGN.md) file for more information.\n\n## Contributing\n\nTorii is still in early development. If you want to contribute, please open an issue or a pull request. We will improve the\ncontribution guidelines as soon as possible.\n\n## Motivation\n\nToday you have the choice between three options to build your Internal Developer Portal:\n\n1. Use [Backstage](https://backstage.io) from Spotify. It's a great solution, but it's hard to extend and customize. You need to be a\n   TypeScript/React expert to extend it.\n2. Use a proprietary SaaS solution like Port, Cortex, OpsLevel, etc. It's a great solution, but it's expensive and you don't have control\n   over the codebase.\n3. Build your own solution from scratch. It's a great solution, but it's hard to maintain and scale. You need to be a full-stack developer\n   to build it.\n\nTorii is a simple, powerful, and extensible open-source Internal Developer Portal that aims to be the best of all worlds. It's easy to\nextend and customize, it's free, and you have control over the codebase.\n\n--- \n\nCurious to understand in more detail the motivation behind Torii? Read these articles:\n\n- [Why Backstage is So Complex? Is There An Alternative?](https://romaricphilogene.substack.com/p/platform-tips-20-why-backstage-is)\n- [What Could Be A Better Alternative To Backstage?](https://romaricphilogene.substack.com/p/platform-tips-21-what-could-be-a)\n\nCurious to understand Torii is built? Read these articles:\n\n- [Building a Better Alternative To Backstage - Part I](https://romaricphilogene.substack.com/p/platform-tips-22-building-a-better)\n- Building a Better Alternative To Backstage - Part II (coming soon)\n- Building a Better Alternative To Backstage - Part III (coming soon)\n\n## FAQ\n\n### What's the difference between Torii and Qovery?\n\nThe Qovery and Torii projects are two different projects with different goals:\n\n- [Qovery](https://www.qovery.com) is an Internal Developer **Platform** focusing on the Software Development Lifecycle (build, deploy, run).\n- Torii is an Internal Developer **Portal** focusing on unifying the experience of all engineering tools.\n\nHere is a features table to help you understand the difference:\n\n| Feature               | Qovery (Internal Developer Platform) | Torii (Internal Developer Portal) |\n| --------------------- | ------------------------------------ | --------------------------------- |\n| Build                 | ✅                                   | ❌                                |\n| Deploy                | ✅                                   | ❌                                |\n| Run                   | ✅                                   | ❌                                |\n| Ephemeral Environment | ✅                                   | ❌                                |\n| Self-Service          | ✅                                   | ✅                                |\n| Catalogs Service      | ❌                                   | ✅                                |\n| Scorecard Service     | ❌                                   | ✅                                |\n| Workflow Service      | Partial with the concept of Pipeline | ✅                                |\n\n### Why Torii?\n\nTorii is a [Japanese gate](https://en.wikipedia.org/wiki/Torii) most commonly found at the entrance of or within a Shinto shrine, where it symbolically marks the transition from the mundane to the sacred.\n","funding_links":[],"categories":["\u003ca name=\"TypeScript\"\u003e\u003c/a\u003eTypeScript","TypeScript"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FQovery%2FTorii","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FQovery%2FTorii","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FQovery%2FTorii/lists"}