{"id":15012834,"url":"https://github.com/automationpanda/bulldoggy-reminders-app","last_synced_at":"2025-04-06T23:17:30.597Z","repository":{"id":99925540,"uuid":"607962854","full_name":"AutomationPanda/bulldoggy-reminders-app","owner":"AutomationPanda","description":"A demo web app for reminders built in Python using FastAPI and HTMX","archived":false,"fork":false,"pushed_at":"2024-03-08T20:44:08.000Z","size":2358,"stargazers_count":276,"open_issues_count":0,"forks_count":46,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-04-06T23:17:06.238Z","etag":null,"topics":["api-testing","bulldoggy","css","fastapi","html","htmx","jinja","playwright","pydantic","pytest","python","requests","software-testing","test-automation","the-way-to-test-software","tinydb","web","web-testing"],"latest_commit_sha":null,"homepage":"","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/AutomationPanda.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":"2023-03-01T02:53:22.000Z","updated_at":"2025-02-22T18:42:13.000Z","dependencies_parsed_at":"2024-01-07T00:07:19.732Z","dependency_job_id":null,"html_url":"https://github.com/AutomationPanda/bulldoggy-reminders-app","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AutomationPanda%2Fbulldoggy-reminders-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AutomationPanda%2Fbulldoggy-reminders-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AutomationPanda%2Fbulldoggy-reminders-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AutomationPanda%2Fbulldoggy-reminders-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AutomationPanda","download_url":"https://codeload.github.com/AutomationPanda/bulldoggy-reminders-app/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247563941,"owners_count":20958971,"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":["api-testing","bulldoggy","css","fastapi","html","htmx","jinja","playwright","pydantic","pytest","python","requests","software-testing","test-automation","the-way-to-test-software","tinydb","web","web-testing"],"created_at":"2024-09-24T19:43:18.248Z","updated_at":"2025-04-06T23:17:30.570Z","avatar_url":"https://github.com/AutomationPanda.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Bulldoggy Logo](static/img/logos/bulldoggy-100px.png)\n\n# Bulldoggy: The Reminders App\n\n*Bulldoggy* is a small demo web app for tracking reminders.\nIt uses:\n\n* [Python](https://www.python.org/) as the main programming language\n* [FastAPI](https://fastapi.tiangolo.com/) for the backend\n* [HTMX](https://htmx.org/) 1.8.6 for handling dynamic interactions (instead of raw JavaScript)\n* [Jinja templates](https://jinja.palletsprojects.com/en/3.1.x/) with HTML and CSS for the frontend\n* [TinyDB](https://tinydb.readthedocs.io/en/latest/index.html) for the database\n* [Playwright](https://playwright.dev/python/) and [pytest](https://docs.pytest.org/) for testing\n\n\n## Learning how it works\n\nDevelopment and testing are two sides of the same coin:\n\n1. To learn how to *develop* the Bulldoggy app, watch my PyTexas 2023 keynote, [*Full-Stack Python*](https://www.youtube.com/watch?v=ka5KRLUn47s).\n2. To learn how to *test* the Bulldoggy app, watch my DjangoCon US 2023 keynote, [*Testing Modern Web Apps Like A Champion*](https://2023.djangocon.us/talks/keynote-testing-modern-web-apps-like-a-champion/).\n\nThese two keynotes are bookends for each other.\n\n\n## Installing dependencies\n\nYou will need a recent version of Python to run this app.\nTo install project dependencies:\n\n```\npip install -r requirements.txt\n```\n\nIt is recommended to install dependencies into a [virtual environment](https://docs.python.org/3/library/venv.html).\n\n\n## Running the app\n\nTo run the app:\n\n```\nuvicorn app.main:app --reload\n```\n\nThen, open your browser to [`http://127.0.0.1:8000`](http://127.0.0.1:8000) to load the app.\n\n\n\n## Running the app with Docker\n\nBuild the image with:\n\n```\ndocker build -t bulldoggy-reminders-app:0.1 .\n```\n\nTo run the image:\n\n```\ndocker run -it --rm --name bulldoggy-reminders-app -p 8000:8000 bulldoggy-reminders-app:0.1\n```\n\n\n## Logging into the app\n\nThe [`config.json`](config.json) file declares the users for the app.\nYou may use any configured user credentials, or change them to your liking.\nThe \"default\" username is `pythonista` with the password `I\u003c3testing`.\n\n\n## Setting the database path\n\nThe app uses TinyDB, which stores the database as a JSON file.\nThe default database filepath is `reminder_db.json`.\nYou may change this path in [`config.json`](config.json).\nIf you change the filepath, the app will automatically create a new, empty database.\n\n\n## Using the app\n\nBulldoggy is a reminders app.\nAfter you log in, you can create reminder lists.\n\n![Bulldoggy login](static/img/readme/bulldoggy-login.png)\n\nEach reminder list appears on the left,\nand the items in the list appear on the right.\nYou may add, delete, or edit lists and items.\nYou may also strike out completed items.\n\n![Bulldoggy reminders](static/img/readme/bulldoggy-reminders.png)\n\n\n## Reading the docs\n\nTo read the API docs, open the following pages:\n\n* [`/docs`](http://127.0.0.1:8000/docs) for classic OpenAPI docs\n* [`/redoc`](http://127.0.0.1:8000/redoc) for more modern ReDoc docs\n\n\n## Why did I build this app in Python?\n\nPersonally, I love Python, and I wanted to demonstrate how to **build a full-stack modern web app *entirely* with Python**.\n\nJavaScript essentially has a near-monopoly on front-end web development.\nBrowsers require JavaScript code to perform dynamic web page interactions.\nHowever, [HTMX](https://htmx.org/) offers a novel way to sidestep this limitation:\nit provides special HTML attributes to denote dynamic interactions for elements.\nUnder the hood, HTMX uses AJAX to issue HTTP requests and swap hypertext contents for elements targetted with its special attributes.\nJavaScript is still there – you just don't need to touch it!\n\nThis enables web frameworks in languages like Python, Go, Java, and others to offer dynamic web page content\ndirectly in HTML *without* requiring developers to explicitly code any JavaScript.\nHTMX empowers you, as a developer, to build beautiful web apps while remaining in the tech stack of your choice!\n\nTo learn more about this app's design, please watch my [PyTexas](https://www.pytexas.org/) 2023 keynote,\n[*Full-Stack Python*](https://www.youtube.com/watch?v=ka5KRLUn47s).\n\n\n## Credits\n\n* I used [DALL-E](https://labs.openai.com/) to generate the Bulldoggy logo\n* I used [ChatGPT](https://chat-gpt.org/chat) to generate parts of the HTML and CSS\n* [Michael Kennedy](https://twitter.com/mkennedy)'s talks at [PyBay 2021](https://www.youtube.com/watch?v=10G874qqtrc) and [Python Web Conference 2022](https://www.youtube.com/watch?v=10G874qqtrc_) on Python + HTMX inspired me\n* The [HTMX docs](https://htmx.org/docs/) and [examples](https://htmx.org/examples/) taught me how to use HTMX\n* A few friends from Twitter and LinkedIn helped me test the app:\n  * [Juan Rosello](https://www.linkedin.com/in/juanrosello/)\n  * [Sharib Islam](https://www.linkedin.com/in/sharibislamqa/)\n  * [therunninglight](https://twitter.com/therunninglight)\n  * [enigma5312](https://twitter.com/enigma5312)\n  * [MrpoSr](https://twitter.com/MrpoSr)\n\n\n## TODO list\n\n* Automate API tests\n* Automate UI tests\n* Automate unit tests\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fautomationpanda%2Fbulldoggy-reminders-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fautomationpanda%2Fbulldoggy-reminders-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fautomationpanda%2Fbulldoggy-reminders-app/lists"}