{"id":37759305,"url":"https://github.com/jonykalavera/dokli","last_synced_at":"2026-01-16T14:34:34.797Z","repository":{"id":251698547,"uuid":"838154676","full_name":"jonykalavera/dokli","owner":"jonykalavera","description":"Magical Dokploy CLI/TUI.","archived":false,"fork":false,"pushed_at":"2025-04-11T22:11:10.000Z","size":328,"stargazers_count":55,"open_issues_count":12,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-12-13T06:53:46.949Z","etag":null,"topics":["cli","dokploy","tui"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jonykalavera.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"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},"funding":{"github":"jonykalavera","open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":null}},"created_at":"2024-08-05T04:05:30.000Z","updated_at":"2025-11-07T14:34:27.000Z","dependencies_parsed_at":"2024-08-05T06:33:16.460Z","dependency_job_id":"da0b27b6-c9dd-4a9b-b532-23b2593dcebf","html_url":"https://github.com/jonykalavera/dokli","commit_stats":null,"previous_names":["jonykalavera/dokli"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jonykalavera/dokli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonykalavera%2Fdokli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonykalavera%2Fdokli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonykalavera%2Fdokli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonykalavera%2Fdokli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jonykalavera","download_url":"https://codeload.github.com/jonykalavera/dokli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jonykalavera%2Fdokli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28479396,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"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":["cli","dokploy","tui"],"created_at":"2026-01-16T14:34:34.697Z","updated_at":"2026-01-16T14:34:34.792Z","avatar_url":"https://github.com/jonykalavera.png","language":"Python","funding_links":["https://github.com/sponsors/jonykalavera"],"categories":[],"sub_categories":[],"readme":"# Dokli\n\n[![Python package](https://github.com/jonykalavera/dokli/actions/workflows/python-package.yml/badge.svg)](https://github.com/jonykalavera/dokli/actions/workflows/python-package.yml)\n\nA magical CLI/TUI for interacting with [Dokploy](https://github.com/Dokploy/dokploy).\n\n```txt\n                                                                    █\n                                                                   ████\n                                                                    ███████            █\n               █████████████████████████                             ████████   ████████\n             ███████████████████████████████                          ██████████████████\n            ████                        █████████                       ██████████████\n            ████          ███               █████████                      ████\n            ███           ███                   ██████████               █████\n            ███                                      ████████████████████████\n            ████████████████                              █████████████████\n            ██████████████████████                               ███████\n            ████            ██████████                     ██████████          ██████\n             ██████               ███████████████████████████████          ████████\n               ████████                ████████████████████             ████████\n             █     █████████                                        ████████     ███\n            █████      █████████                                ████████      ██████\n            ████████       ███████████                    ███████████      █████████\n            ████ ██████         ████████████████████████████████        ███████ ████\n            ████   ███████            ████████████████████           ███████    ████\n             █████    ████████                                   ████████    ██████\n              ███████     ████████                           █████████     ███████\n              █████████      ████████████              ███████████      ██████████\n               ████ ██████        ████████████████████████████       ███████ ████\n                ████   ██████            ██████████████            ██████   ████\n                 █████   ███████                               ████████   █████\n                   █████    █████████                      █████████    █████\n                    ██████      ████████████████████████████████      ██████\n                      ██████         ██████████████████████         ██████\n                        ███████                                  ██████\n                           ████████                          ████████\n                              ███████████               ██████████\n                                   ██████████████████████████\n                                          ████████████\n```\n\n## Installation\n\n```bash\npip install git+https://github.com/jonykalavera/dokli.git\n# with TUI support\npip install git+https://github.com/jonykalavera/dokli.git#egg=dokli[tui]\n```\n\nTested with Dokploy versions:\n\n- 0.6.1\n- 0.18.1\n\n## Configuration\n\nCreate the configuration file at `~/.config/dokli/dokli.yaml`. Example:\n\n```yaml\nconnections:\n  - name: test-env\n    url: https://test.example.com\n    api_key: ****************************************\n    notes: \"Our test environment. Handle with care!\"\n  - name: prod-env\n    url: https://prod.example.com\n    api_key_cmd: \"secret-tool lookup dokli prodEnvApikey\"\n    notes: \"Our prod environment. Handle with even more care!\"\n```\n\nYou can use `api_key_cmd` to load the API key from a command such as [secret-tool](https://manpages.org/secret-tool) instead of entering it in the config file. This is highly recommended for security reasons.\n\nConfiguration uses [pydantic-settings](https://docs.pydantic.dev/latest/concepts/pydantic_settings/) which means it can also be set via [environment variables](https://docs.pydantic.dev/latest/concepts/pydantic_settings/#parsing-environment-variable-values) using the `DOKLI_` prefix.\n\n## CLI\n\n### Features\n\n- Commands are inferred from the OpenAPI spec, which allows:\n  - support for multiple Dokploy API versions.\n  - support for all API entities actions/verbs.\n- magical JSON parameters `%json:{\"projectId\": \"daspdoada798sda\"}`\n- magical file parameters `%file:/path/to/data/foo.redis.json`\n- output formats:\n  - yaml\n  - json\n  - python\n  - table (experimental)\n\n## Usage\n\n```bash\n$ dokly\n\n\n Usage: dokli [OPTIONS] COMMAND [ARGS]...\n\n Magical Dokploy CLI/TUI.\n\n╭─ Options ────────────────────────────────────────────────────────────────────╮\n│ --install-completion          Install completion for the current shell.      │\n│ --show-completion             Show completion for the current shell, to copy │\n│                               it or customize the installation.              │\n│ --help                        Show this message and exit.                    │\n╰──────────────────────────────────────────────────────────────────────────────╯\n╭─ Commands ───────────────────────────────────────────────────────────────────╮\n│ api        API commands.                                                     │\n│ tui        Text User Interface.                                              │\n╰──────────────────────────────────────────────────────────────────────────────╯\n\n\n$ dokly api test-env project all\n- adminId: ysHDHlhX4a3zOG2fLsske\n  applications: []\n  compose: []\n  createdAt: '2024-08-05T02:45:38.168Z'\n  description: null\n  mariadb: []\n  mongo: []\n  mysql: []\n  name: Dokli\n  postgres: []\n  projectId: zuanf1SWHMFO11y6xqpRR\n  redis: []\n\n$ dokli api test-env project create --body '%json:{\"name\": \"Dokli\"}' --format table\n               API Response\n┏━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n┃ Key         ┃ Value                    ┃\n┡━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n│ projectId   │ zuanf1SWHMFO11y6xqpRR\n│ name        │ Dokli                    │\n│ description │ None                     │\n│ createdAt   │ 2024-08-05T02:45:38.168Z │\n│ adminId     │ ysHDHlhX4a3zOG2fLsske    │\n└─────────────┴──────────────────────────┘\n\n$ dokli api test-env project one --format json zuanf1SWHMFO11y6xqpRR\n{\"projectId\": \"zuanf1SWHMFO11y6xqpRR\", \"name\": \"Dokli\", \"description\": null,\n\"createdAt\": \"2024-08-05T02:45:38.168Z\", \"adminId\": \"ysHDHlhX4a3zOG2fLsske\",\n\"applications\": [], \"mariadb\": [], \"mongo\": [], \"mysql\": [], \"postgres\": [],\n\"redis\": [], \"compose\": []}\n```\n\n## TUI\n\nStill a WIP. Basic functionality will be implemented at 0.2.0 release.\n\n![Screenshot from 2024-08-04 23-39-14](https://github.com/user-attachments/assets/9943d053-f3a6-40dd-90b7-07502fb81925)\n![Screenshot from 2024-08-04 23-39-04](https://github.com/user-attachments/assets/acce2413-7b48-472d-899a-71d469b6113d)\n![Screenshot from 2024-08-05 00-06-58](https://github.com/user-attachments/assets/17fefe01-e072-4c18-8cc1-159de9e94adc)\n\n[http://www.youtube.com/watch?v=IAnHfFV9_jU](http://www.youtube.com/watch?v=IAnHfFV9_jU)\n\n## Motivation\n\nThe CLI is designed to keep up with any changes in the API. Commands are dynamically inferred from the OpenAPI spec.\nI did this because I want to do some test automation and the official CLI seems incomplete at the moment. The TUI is because I am into tools like [yazi](https://yazi-rs.github.io/), [lazygit](https://github.com/jesseduffield/lazygit), [k9s](https://k9scli.io/), [dry](https://github.com/moncho/dry), etc. I like to keep my terminal open at all times `$`.\nAlso, it seemed to me like something cool to do this weekend. I learned a bunch about [texual](https://textual.textualize.io/), [typer](https://github.com/tiangolo/typer) and [Dokploy](https://github.com/Dokploy/dokploy).\n\n## Buy me a 🌮\n\nI'm Mexican, I prefer tacos. But ☕ is also nice. You can use the 🫶 sponsor button on the top.\n\nAlso pretty please and thanks in advance 🥺.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonykalavera%2Fdokli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjonykalavera%2Fdokli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjonykalavera%2Fdokli/lists"}