{"id":18073365,"url":"https://github.com/blakewilliams/amaro","last_synced_at":"2026-02-11T23:37:39.113Z","repository":{"id":213151620,"uuid":"733145688","full_name":"BlakeWilliams/amaro","owner":"BlakeWilliams","description":"Experimental CLI for applications","archived":false,"fork":false,"pushed_at":"2024-12-01T23:52:25.000Z","size":149,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-19T22:12:49.152Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/BlakeWilliams.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":"2023-12-18T16:59:35.000Z","updated_at":"2025-04-05T18:58:16.000Z","dependencies_parsed_at":null,"dependency_job_id":"f19a085f-3cc5-4207-aa2d-6a582659b774","html_url":"https://github.com/BlakeWilliams/amaro","commit_stats":null,"previous_names":["blakewilliams/amaro"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/BlakeWilliams/amaro","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlakeWilliams%2Famaro","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlakeWilliams%2Famaro/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlakeWilliams%2Famaro/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlakeWilliams%2Famaro/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/BlakeWilliams","download_url":"https://codeload.github.com/BlakeWilliams/amaro/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/BlakeWilliams%2Famaro/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29349614,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T20:11:40.865Z","status":"ssl_error","status_checked_at":"2026-02-11T20:10:41.637Z","response_time":97,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2024-10-31T10:06:32.993Z","updated_at":"2026-02-11T23:37:39.099Z","avatar_url":"https://github.com/BlakeWilliams.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Amaro\n\nIf frameworks were operating systems, Rails would be Ubuntu and Amaro would be\nArch. Amaro attempts to include all the bells and whistles needed for\nproduction apps, but the glue and application is up to you. (guided, of course)\n\nAmaro is a composable application framework for Go, aiming to create a small\necosystem of components like http routers, job runners, test helpers, and other\nframeworks/tooling necessary to make complex Go applications.\n\n## Getting Started\n\nThe core Amaro package (github.com/blakewilliams/amaro) is focused on creating\nrunnable commands in your project, and is how other packages hook into your\nproject.\n\nFor example, to get started with a web project you would create\n`cmd/appname/main.go` and include the following:\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\n\t\"github.com/blakewilliams/amaro\"\n    \"github.com/you/project/core\"\n)\n\nfunc main() {\n\t// Application must implement `AppName()` and `Log()`\n\trunner := amaro.NewApplication(\u0026core.Application{\n\t\t// your application configuration\n    })\n\trunner.Execute(context.TODO())\n}\n```\n\nThis requires a \"core\" application, that must implement the `amaro.Application` interface.\n\n### Adding a command\n\nAdding commands is simple, implement the `Command[T]` interface on a struct\n(typically a dedicated struct):\n\n```\ntype GreetCmd[T amaro.Application] struct {\n\tName string\n}\n\nfunc (g *GreetCmd[T]) CommandName() string { return \"greet\" }\nfunc (g *GreetCmd[T]) CommandDescription() string { return \"Greets you\" }\n// The actual command\nfunc (g *GreetCmd[T]) RunCommand(ctx context.Context, app T) {\n\tapp.Log(fmt.Sprintf(\"Hello, %s!\", g.Name))\n}\n```\n\nThen register your command in your `main` function like\n`runner.RegisterCommand(\u0026GreetCmd{Name: \"Fox Mulder\"})` and run your command\nwith `go run \u003cyour cmd path\u003e greet`!\n\n## Web\n\nTODO document how to bootstrap a web app\n\n### Sessions\n\n### Flash messages (notices)\n\n### CSRF\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblakewilliams%2Famaro","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fblakewilliams%2Famaro","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fblakewilliams%2Famaro/lists"}