{"id":20102032,"url":"https://github.com/heikkilamarko/todo-app","last_synced_at":"2025-05-06T07:31:02.613Z","repository":{"id":45205531,"uuid":"363392502","full_name":"heikkilamarko/todo-app","owner":"heikkilamarko","description":"Todo App","archived":false,"fork":false,"pushed_at":"2025-02-26T14:03:38.000Z","size":13661,"stargazers_count":19,"open_issues_count":0,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-22T13:06:17.414Z","etag":null,"topics":["alloy","asyncapi","caddy","centrifugo","golang","grafana","json-schema","keycloak","letsencrypt","loki","minio","nats","open-policy-agent","openapi","postgresql","sops","svelte","sveltekit","temporalio"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":false,"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/heikkilamarko.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,"zenodo":null}},"created_at":"2021-05-01T11:22:41.000Z","updated_at":"2025-02-26T14:03:42.000Z","dependencies_parsed_at":"2024-03-04T12:28:30.451Z","dependency_job_id":"b06e6bbd-0b4a-4a7b-ac88-635c798aa946","html_url":"https://github.com/heikkilamarko/todo-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/heikkilamarko%2Ftodo-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heikkilamarko%2Ftodo-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heikkilamarko%2Ftodo-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/heikkilamarko%2Ftodo-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/heikkilamarko","download_url":"https://codeload.github.com/heikkilamarko/todo-app/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252180008,"owners_count":21707120,"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":["alloy","asyncapi","caddy","centrifugo","golang","grafana","json-schema","keycloak","letsencrypt","loki","minio","nats","open-policy-agent","openapi","postgresql","sops","svelte","sveltekit","temporalio"],"created_at":"2024-11-13T17:28:39.350Z","updated_at":"2025-05-06T07:31:02.015Z","avatar_url":"https://github.com/heikkilamarko.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Todo App\n\nTodo App is a **hobby project** that is primarily focused around being a playground for experimenting with different technologies.\n\n## Application Architecture\n\n![Todo App Architecture](doc/architecture.svg)\n\n## Secrets Management\n\nThis repository uses [SOPS](https://getsops.io/) with [age](https://github.com/mozilla/sops#22encrypting-using-age) for managing secrets.\n\nSee [Configuration and Secrets Management](config/) for details.\n\n## Reverse Proxy\n\n- [Caddy](https://caddyserver.com/)\n\n## Real-Time Messaging\n\n- [Centrifugo](https://centrifugal.dev/)\n  - URL: http://centrifugo.todo-app.com\n  - password: `S3c_r3t!`\n\n## Workflow Engine\n\n- [Temporal](https://temporal.io/)\n  - URL: http://temporal.todo-app.com\n\n## Monitoring Stack\n\n- [Grafana](https://grafana.com/oss/grafana/)\n  - URL: http://grafana.todo-app.com\n  - username: `admin`\n  - password: `S3c_r3t!`\n- [Loki](https://grafana.com/oss/loki/)\n- [Alloy](https://grafana.com/oss/alloy-opentelemetry-collector/)\n- [MinIO](https://min.io/)\n  - URL: http://minio.todo-app.com\n  - username: `console`\n  - password: `S3c_r3t!`\n\n## Identity and Access Management\n\n- [Keycloak](https://www.keycloak.org/)\n  - URL: http://auth.todo-app.com\n  - username: `admin`\n  - password: `S3c_r3t!`\n\n## Running the App Locally\n\n1. Add the following entries to your `/etc/hosts` file:\n\n```\n127.0.0.1    todo-app.com\n127.0.0.1    auth.todo-app.com\n127.0.0.1    centrifugo.todo-app.com\n127.0.0.1    temporal.todo-app.com\n127.0.0.1    grafana.todo-app.com\n127.0.0.1    alloy.todo-app.com\n127.0.0.1    faro.todo-app.com\n127.0.0.1    minio.todo-app.com\n```\n\n2. Make sure you have the unencrypted secrets in the `env` directory. See [Configuration and Secrets Management](config/) for details.\n\n3. Run Docker Compose\n\n```bash\ndocker compose up --build -d\n```\n\n4. Open the App in browser: http://todo-app.com\n   - Normal user:\n     - username: `demouser`\n     - password: `S3c_r3t!`\n   - Viewer (read-only) user:\n     - username: `demoviewer`\n     - password: `S3c_r3t!`\n\n## Tools\n\n### JSON Schema Generator\n\nThe app uses [JSON Schema](https://json-schema.org/) for message validation. See [json-schema-generator](tools/json-schema-generator) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheikkilamarko%2Ftodo-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fheikkilamarko%2Ftodo-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fheikkilamarko%2Ftodo-app/lists"}