{"id":28278093,"url":"https://github.com/pjtunstall/penumbra","last_synced_at":"2026-05-03T09:37:02.303Z","repository":{"id":290934186,"uuid":"969207840","full_name":"pjtunstall/penumbra","owner":"pjtunstall","description":"A task manager web app, written mostly in Go, using Go's HTML templates, with minimal JavaScript, and the DaisyUI CSS framework for styling.","archived":false,"fork":false,"pushed_at":"2025-05-11T19:57:24.000Z","size":124,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-21T07:14:50.199Z","etag":null,"topics":["api","go","golang","rest-api","sql","sqlite"],"latest_commit_sha":null,"homepage":"","language":"Go","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/pjtunstall.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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,"zenodo":null}},"created_at":"2025-04-19T16:25:11.000Z","updated_at":"2025-05-14T08:38:39.000Z","dependencies_parsed_at":null,"dependency_job_id":"db80b4c7-7f68-4a4c-bcc2-74d8eff45a5c","html_url":"https://github.com/pjtunstall/penumbra","commit_stats":null,"previous_names":["pjtunstall/penumbra"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pjtunstall/penumbra","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjtunstall%2Fpenumbra","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjtunstall%2Fpenumbra/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjtunstall%2Fpenumbra/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjtunstall%2Fpenumbra/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pjtunstall","download_url":"https://codeload.github.com/pjtunstall/penumbra/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pjtunstall%2Fpenumbra/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":260609467,"owners_count":23035946,"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","go","golang","rest-api","sql","sqlite"],"created_at":"2025-05-21T07:14:33.886Z","updated_at":"2026-05-03T09:37:02.298Z","avatar_url":"https://github.com/pjtunstall.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PENUMBRA\n\n- [Overview](#overview)\n- [Project status](#project-status)\n- [Usage](#usage)\n- [Routes](#routes)\n\n## Overview\n\nA task-manager app written in Go as a learning exercise.\n\n## Project status\n\nThis project should be considered incomplete if any `TODO` remains in the actual code. Any CI/Cd pipeline should enforce that.\n\n## Usage\n\nDowload and install the [Go programming language](https://go.dev/doc/install) if you haven't already.\n\nTo initialize a database, compile the dbinit binary with `go build -o dbinit cmd/dbinit/main.go` and run it `./dbinit` (or the equivalent command for your operating system). This will initialize a database called `dev.db` in a newly created `data` directory in the root of this project.\n\nThen to build and run the app in one step, run `go run cmd/webapp/main.go` (assuming your working directory is the project root). Open a web browser and navigate to `http://localhost:8080`.\n\nTo run all tests, run `go test ./...`.\n\n## Routes\n\n- `GET  /` – redirect to `/login` if not logged in, otherwise redirect to `/dashboard`\n- `GET  /login` – show login form\n- `POST /login` – submit login form\n- `GET /register` - show register form\n- `POST /register` - submit register form\n- `GET /dashboard` - show dashboard, listing any task titles, due datss, and status, with the option to mark them as done\n- `GET /about` - show about page\n- `GET /logout` - log out and redirect to `/login`\n- `GET /tasks` - list all tasks for the current user, including descriptions, due dates, and status\n- `GET /tasks/create` - show form to create new task\n- `POST /tasks/create` - submit form to create new task\n- `GET /tasks/{id}` - show task details, including description, due date, and status in a form that allows the task to be deleted, or edited and updated.\n- `POST /tasks/delete/{id}` - delete task\n- `POST /tasks/done/{id}` - mark task as done\n- `POST /tasks/update/{id}` - submit form to update task\n\nRegarding the choice of names, Chat remarks:\n\n\u003e You're following a classic HTML form-based pattern, and it's perfectly fine for a traditional server-rendered app. REST purists would nudge you toward resource-based paths and HTTP verbs, but in practice for web apps, what you're doing is conventional and user-friendly.\n\u003e\n\u003e That said, here's how you could tweak your route names to better align with REST conventions while still supporting HTML forms:\n\u003e\n\u003e | Purpose                    | Current Route           | Suggested REST-style Route                                | Notes                                                             |\n\u003e | -------------------------- | ----------------------- | --------------------------------------------------------- | ----------------------------------------------------------------- |\n\u003e | Show empty \"new task\" form | GET /tasks/create       | GET /tasks/new                                            | `new` is a common REST-y way to signal a form for creation        |\n\u003e | Submit new task form       | POST /tasks/create      | POST /tasks                                               | REST uses POST to the collection to create                        |\n\u003e | Show edit task form        | GET /tasks/{id}         | GET /tasks/{id}/edit                                      | `edit` is a conventional form path in REST-style HTML apps        |\n\u003e | Submit task update         | POST /tasks/update      | POST /tasks/{id} or /{id}/update                          | Use POST with clear naming since browsers don’t support PUT/PATCH |\n\u003e | Delete/update UI           | Part of GET /tasks/{id} | Consider GET /tasks/{id}/edit and POST /tasks/{id}/delete | Split views/actions for clarity                                   |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpjtunstall%2Fpenumbra","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpjtunstall%2Fpenumbra","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpjtunstall%2Fpenumbra/lists"}