{"id":51262543,"url":"https://github.com/webdastur/dj-admin-tui","last_synced_at":"2026-06-29T13:01:55.976Z","repository":{"id":362041846,"uuid":"1255994113","full_name":"webdastur/dj-admin-tui","owner":"webdastur","description":"Drive the Django admin from your terminal — browse, search, filter, edit, and run admin actions, with the same permissions and audit as the web admin. Built on Textual.","archived":false,"fork":false,"pushed_at":"2026-06-02T09:58:47.000Z","size":1199,"stargazers_count":8,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-02T11:18:30.396Z","etag":null,"topics":["admin","cli","console","devops","django","django-admin","python","ssh","terminal","terminal-ui","textual","tui"],"latest_commit_sha":null,"homepage":"https://dj-admin-tui.readthedocs.io/","language":"Python","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/webdastur.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":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-01T11:11:03.000Z","updated_at":"2026-06-02T11:10:15.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/webdastur/dj-admin-tui","commit_stats":null,"previous_names":["webdastur/dj-admin-tui"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/webdastur/dj-admin-tui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdastur%2Fdj-admin-tui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdastur%2Fdj-admin-tui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdastur%2Fdj-admin-tui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdastur%2Fdj-admin-tui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webdastur","download_url":"https://codeload.github.com/webdastur/dj-admin-tui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webdastur%2Fdj-admin-tui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34927687,"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-06-29T02:00:05.398Z","response_time":58,"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":["admin","cli","console","devops","django","django-admin","python","ssh","terminal","terminal-ui","textual","tui"],"created_at":"2026-06-29T13:01:54.868Z","updated_at":"2026-06-29T13:01:55.958Z","avatar_url":"https://github.com/webdastur.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# dj-admin-tui\n\n[![PyPI version](https://img.shields.io/pypi/v/dj-admin-tui.svg?v=2)](https://pypi.org/project/dj-admin-tui/)\n[![Python versions](https://img.shields.io/pypi/pyversions/dj-admin-tui.svg?v=2)](https://pypi.org/project/dj-admin-tui/)\n[![Django versions](https://img.shields.io/badge/django-4.2%20%7C%205.2%20%7C%206.0-0C4B33.svg)](https://www.djangoproject.com/)\n[![CI](https://github.com/webdastur/dj-admin-tui/actions/workflows/ci.yml/badge.svg)](https://github.com/webdastur/dj-admin-tui/actions/workflows/ci.yml)\n[![Docs](https://readthedocs.org/projects/dj-admin-tui/badge/?version=latest)](https://dj-admin-tui.readthedocs.io)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](./LICENSE)\n\nA [Textual](https://textual.textualize.io/) terminal UI that drives the **Django\nadmin** from your terminal: browse, search, filter, sort, create, edit, delete,\nand run admin actions — honoring the **same permissions and audit log** as the\nweb admin, because it reuses Django's own admin internals rather than\nreimplementing them.\n\nIt works with **zero configuration**: any project that has `ModelAdmin`s gets a\nworking terminal admin with no extra code. Write a `tui.py` only when you want\nTUI-specific behaviour.\n\n![dj-admin-tui — the changelist screen: a sortable books table, a filter sidebar, pagination, and a keymap footer](https://raw.githubusercontent.com/webdastur/dj-admin-tui/main/docs/dj_admin_tui.png)\n\n## Why\n\nServers, CI shells, and SSH sessions don't have a browser. `dj-admin-tui` gives\nyou the day-to-day admin workflows — find a record, fix a field, run a bulk\naction — over a plain terminal, with the exact permission scoping and audit\ntrail the web admin would apply.\n\n## Features\n\n- **Reuses the admin, never reimplements it.** Querysets, search, filtering,\n  ordering, pagination, form construction \u0026 validation, permissions, actions,\n  and audit all come from your registered `ModelAdmin` and Django's own\n  internals. The TUI only renders and adds interaction.\n- **Zero-config.** A project with `ModelAdmin`s and no `tui.py` works fully.\n- **Full CRUD** — create / edit / delete with the admin's fieldsets, widgets,\n  and validation, including foreign keys, many-to-many, and multi-line text.\n- **Search, sort, and filter** — driven by `search_fields`, `list_filter`, and\n  `get_ordering_field_columns`, identical to the web changelist.\n- **Admin actions** — bulk actions and per-row actions, with confirmation.\n- **Permission-scoped \u0026 audited** — every operation runs as a chosen user and\n  writes `LogEntry` rows, exactly like the web admin.\n- **Keyboard and mouse** — arrows/Enter or click; `?` shows the keymap.\n- **Themeable** — bundled themes plus a single-stylesheet design system you can\n  override with your own `.tcss`.\n\n## Trust model — read first\n\nThe TUI runs **in-process** as a `manage.py` subcommand. There is no network\nport, no token, no remote API.\n\n\u003e Whoever can run `manage.py` on the host already has full database access. The\n\u003e `--user` flag scopes which records the operator sees and attributes audit\n\u003e entries to that account — it is **NOT** an access-control boundary. Access\n\u003e control is the host's responsibility (Unix permissions, SSH, etc.).\n\n## Install\n\n```bash\npip install dj-admin-tui\n```\n\n```python\n# settings.py\nINSTALLED_APPS += [\"dj_admin_tui\"]\n```\n\n## Launch\n\n```bash\npython manage.py admin_tui                # run as the lone superuser\npython manage.py admin_tui --user alice   # run as alice (must be is_staff)\n```\n\nYou land on an index of every app and model the web admin would show that user.\nArrows + Enter (or the mouse) to drill in, `q` to quit, `?` for help.\n\n## Customising (optional)\n\nDrop a `tui.py` next to your `admin.py` — it is autodiscovered like `admin.py`:\n\n```python\n# myapp/tui.py\nfrom dj_admin_tui import register, TuiAdmin\n\n@register(Book)\nclass BookTui(TuiAdmin):\n    row_actions = [\"mark_featured\"]   # TUI-only per-row actions\n```\n\nThe public API is exactly five names; everything else under `dj_admin_tui.*`\nis internal and may change without notice:\n\n```python\nfrom dj_admin_tui import register, TuiAdmin, tui_site, field_widgets, AdminTuiApp\n```\n\n## Documentation\n\nFull docs live at **[dj-admin-tui.readthedocs.io](https://dj-admin-tui.readthedocs.io)**:\n\n| Topic | What it covers |\n|-------|----------------|\n| [Installation](https://dj-admin-tui.readthedocs.io/en/latest/installation/) | Requirements, install, first launch, trust model |\n| [Usage](https://dj-admin-tui.readthedocs.io/en/latest/usage/) | Keymap, mouse map, search / sort / filter, the screens |\n| [Configuration](https://dj-admin-tui.readthedocs.io/en/latest/configuration/) | The `ADMIN_TUI` settings dict |\n| [CLI](https://dj-admin-tui.readthedocs.io/en/latest/cli/) | The `manage.py admin_tui` command, flags, exit codes |\n| [Theming](https://dj-admin-tui.readthedocs.io/en/latest/theming/) | Bundled themes, custom themes, `.tcss` overrides |\n| [Extending](https://dj-admin-tui.readthedocs.io/en/latest/extending/) | `TuiAdmin` overlays, hooks, custom widgets \u0026 screens |\n| [API](https://dj-admin-tui.readthedocs.io/en/latest/api/) | The public Python API and stability policy |\n| [Architecture](https://dj-admin-tui.readthedocs.io/en/latest/architecture/) | How it fits together; the reuse-the-admin design |\n\n## Supported versions\n\n- **Python:** 3.12, 3.13, 3.14\n- **Django:** 4.2 LTS, 5.2 LTS, 6.0\n- **Textual:** `\u003e=8.2,\u003c9`\n\nSee [`pyproject.toml`](./pyproject.toml) for the exact ranges.\n\n## Contributing\n\nIssues and pull requests are welcome. See [CONTRIBUTING.md](./CONTRIBUTING.md)\nfor the dev setup, test, and lint workflow. Public-API changes follow SemVer\nwith a deprecation path.\n\n## License\n\n[MIT](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebdastur%2Fdj-admin-tui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebdastur%2Fdj-admin-tui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebdastur%2Fdj-admin-tui/lists"}