{"id":13629956,"url":"https://github.com/dtcooper/tomato","last_synced_at":"2025-10-23T19:31:23.267Z","repository":{"id":59944837,"uuid":"534416424","full_name":"dtcooper/tomato","owner":"dtcooper","description":"🍅 Tomato Radio Automation. Dead simple radio ads.","archived":false,"fork":false,"pushed_at":"2025-01-30T20:19:59.000Z","size":11773,"stargazers_count":26,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-31T20:53:21.858Z","etag":null,"topics":["circuitpython","daisyui","django","django-admin","docker","electron","esbuild","mkdocs","svelte","tailwindcss"],"latest_commit_sha":null,"homepage":"https://dtcooper.github.io/tomato/","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/dtcooper.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,"publiccode":null,"codemeta":null}},"created_at":"2022-09-08T22:36:29.000Z","updated_at":"2025-01-30T20:15:12.000Z","dependencies_parsed_at":"2024-01-05T04:27:29.507Z","dependency_job_id":"6a42bd44-eb5b-44a4-a267-6c6b1fa24794","html_url":"https://github.com/dtcooper/tomato","commit_stats":{"total_commits":1178,"total_committers":2,"mean_commits":589.0,"dds":0.431239388794567,"last_synced_commit":"c06bf706a2d290232d54f8e8896c0a496752fea1"},"previous_names":[],"tags_count":106,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtcooper%2Ftomato","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtcooper%2Ftomato/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtcooper%2Ftomato/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dtcooper%2Ftomato/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dtcooper","download_url":"https://codeload.github.com/dtcooper/tomato/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237882168,"owners_count":19381176,"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":["circuitpython","daisyui","django","django-admin","docker","electron","esbuild","mkdocs","svelte","tailwindcss"],"created_at":"2024-08-01T22:01:25.381Z","updated_at":"2025-10-23T19:31:22.734Z","avatar_url":"https://github.com/dtcooper.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003ca href=\"https://dtcooper.github.io/tomato/\"\u003e\n    \u003cimg src=\"https://raw.github.com/dtcooper/tomato/main/docs/assets/tomato.png\" width=\"100\"\u003e\u003cbr\u003e\n    Tomato Radio Automation\n  \u003c/a\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://dtcooper.github.io/tomato/\"\u003eDocumentation\u003c/a\u003e |\n  \u003ca href=\"https://dtcooper.github.io/tomato/client/\"\u003eDesktop App\u003c/a\u003e |\n  \u003ca href=\"https://dtcooper.github.io/tomato/server/\"\u003eServer\u003c/a\u003e |\n  \u003ca href=\"https://github.com/dtcooper/tomato/blob/main/controller/\"\u003eButton Box\u003c/a\u003e\n\u003c/p\u003e\n\n[![Client build status](https://img.shields.io/github/actions/workflow/status/dtcooper/tomato/build-client.yml?branch=main\u0026label=client%20build)](https://github.com/dtcooper/tomato/actions/workflows/build-client.yml) [![Server build \u0026amp deploy status](https://img.shields.io/github/actions/workflow/status/dtcooper/tomato/build-deploy-on-push.yml?branch=main\u0026label=server%20build)](https://github.com/dtcooper/tomato/actions/workflows/build-deploy-on-push.yml) [![Docs build status](https://img.shields.io/github/actions/workflow/status/dtcooper/tomato/docs.yml?branch=main\u0026label=docs%20build)](https://github.com/dtcooper/tomato/actions/workflows/docs.yml)\n\n[![Latest release](https://img.shields.io/github/v/tag/dtcooper/tomato?filter=!preview-build\u0026label=release)](https://github.com/dtcooper/tomato/releases/latest) [![MIT License](https://img.shields.io/github/license/dtcooper/tomato)](https://github.com/dtcooper/tomato/blob/main/LICENSE) [![GitHub stars](https://img.shields.io/github/stars/dtcooper/tomato?style=flat)](https://github.com/dtcooper/tomato/stargazers) [![GitHub Issues](https://img.shields.io/github/issues/dtcooper/tomato)](https://github.com/dtcooper/tomato/issues) [![Latest commit](https://img.shields.io/github/last-commit/dtcooper/tomato)](https://github.com/dtcooper/tomato/commits/)\n\nClient and server for Tomato Radio Automation software. Tomato is easy to use,\nand hard to screw up playout software written for the specific use case of\n[Burning Man Information Radio](https://bmir.org).\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"https://raw.github.com/dtcooper/tomato/main/docs/assets/client/screenshot.png\" width=\"850\"\u003e\n\u003c/div\u003e\n\nThe backend server is written in [Python](https://www.python.org/)'s\n[Django web framework](https://www.djangoproject.com/), heavily leveraging its\n[automatic admin interface](https://docs.djangoproject.com/en/4.1/ref/contrib/admin/).\n\nThe desktop app is a native, cross-platform [Svelte](https://svelte.dev/) +\n[Electron](https://www.electronjs.org/) app. It communicates with the backend\nvia a websocket and supports intermittent connectivity loss.\n\n## Running the Code\n\n### Server\n\nDetailed instructions on how to install the server in both development and\nproduction environments\n[can be found here in the docs](https://dtcooper.github.io/tomato/server/installation/).\n\n### Client (Desktop App)\n\nDownload a\n[development preview build here](https://github.com/dtcooper/tomato/releases/tag/preview-build)\nor run the client's code locally\n[following the instruction here](https://dtcooper.github.io/tomato/client/#run-development-code)\n\n### Documentation\n\nTo run the documentation locally, install [Python 3.9](https://www.python.org/)\nor higher. Then in your terminal,\n\n```bash\n# Install Poetry (for Python dependencies) if you don't already have it.\ncurl -sSL https://install.python-poetry.org | python3 -\n\n# Clone the repo\ngit clone https://github.com/dtcooper/tomato.git\n\n# Enter the docs code\ncd tomato/docs\n\n# Install dependencies and run\npoetry install\npoetry run mkdocs serve\n```\n\nHead over to \u003chttp://localhost:8888/\u003e in your web browser.\n\n## Stack\n\n* Client \u0026mdash; JavaScript ([Node.js](https://nodejs.org/en/))\n  * [Electron](https://electronjs.org/), [Svelte](https://svelte.dev/),\n    [Tailwind CSS](https://tailwindcss.com/), [daisyUI](https://daisyui.com/),\n    and [esbuild](https://esbuild.github.io/).\n* Server \u0026mdash; [Python](https://www.python.org/)\n  * Libraries: [Django](https://www.djangoproject.com/), [huey](https://huey.readthedocs.io/en/latest/),\n    [Constance](https://django-constance.readthedocs.io/en/latest/), and [Starlette](https://www.starlette.io/)\n  * Tools, Databases, and Containers: [PostgreSQL](https://www.postgresql.org/),\n    [docker-nginx-certbot](https://github.com/JonasAlfredsson/docker-nginx-certbot),\n    and [Dozzle](https://dozzle.dev/).\n* MIDI Controller Button Box \u0026mdash;\n  [Raspberry Pi Pico](https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html)\n  (or similar) and [CircuitPython](https://circuitpython.org/)\n  * See [`controller/README.md`](controller/README.md) for firmware/setup instructions\n* Documentation\n  * [MkDocs](https://www.mkdocs.org/) and [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/)\n\n## Acknowledgements\n\nTomato's UX and UI was designed in part by\n[Miranda Kay](mailto:miranda.e.kay@gmail.com). Testing and feedback was provided\nby the entire [Burning Man Information Radio (BMIR)](https://bmir.org) team.\n\n## TODO List\n\n_See [TODO](TODO.md) list._\n\n## License\n\nThis project is licensed under the [MIT License](https://opensource.org/licenses/MIT)\n\u0026mdash; see the [LICENSE](https://github.com/dtcooper/tomato/blob/main/LICENSE)\nfile for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtcooper%2Ftomato","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdtcooper%2Ftomato","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdtcooper%2Ftomato/lists"}