{"id":20713990,"url":"https://github.com/ejsdotsh/ejsb","last_synced_at":"2026-05-06T04:07:39.089Z","repository":{"id":96447180,"uuid":"560079609","full_name":"ejsdotsh/ejsb","owner":"ejsdotsh","description":"e.j.'s system builder","archived":false,"fork":false,"pushed_at":"2026-04-11T00:15:05.000Z","size":393,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-04-11T01:17:45.150Z","etag":null,"topics":["ansible","ansible-project","api","automation","go","homelab","jsonnet","network-automation","python"],"latest_commit_sha":null,"homepage":"","language":"Jinja","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/ejsdotsh.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-10-31T17:37:42.000Z","updated_at":"2026-04-11T00:13:42.000Z","dependencies_parsed_at":"2023-09-03T07:30:49.052Z","dependency_job_id":"e64e4f72-473f-4844-b0a9-f8b68dacc531","html_url":"https://github.com/ejsdotsh/ejsb","commit_stats":null,"previous_names":["ejsdotsh/ndots","ejsdotsh/homelab","ejsdotsh/ejsb"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ejsdotsh/ejsb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejsdotsh%2Fejsb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejsdotsh%2Fejsb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejsdotsh%2Fejsb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejsdotsh%2Fejsb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ejsdotsh","download_url":"https://codeload.github.com/ejsdotsh/ejsb/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ejsdotsh%2Fejsb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32677958,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-06T02:33:58.958Z","status":"ssl_error","status_checked_at":"2026-05-06T02:33:39.611Z","response_time":117,"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":["ansible","ansible-project","api","automation","go","homelab","jsonnet","network-automation","python"],"created_at":"2024-11-17T02:28:33.601Z","updated_at":"2026-05-06T04:07:39.063Z","avatar_url":"https://github.com/ejsdotsh.png","language":"Jinja","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nSPDX-FileCopyrightText: 2020-Present j. e.j. sahala \u003cgit@ejs.sh\u003e\n\nSPDX-License-Identifier: MPL-2.0\n--\u003e\n\n# ejsb - e.j.'s system builder\n\n[![Build Status](https://img.shields.io/github/actions/workflow/status/ejsdotsh/ejsb/build.yaml?branch=main\u0026logo=github)](https://github.com/ejsdotsh/ejsb/workflows)\n[![Latest Release](https://img.shields.io/github/v/release/ejsdotsh/ejsb?logo=github)](https://github.com/ejsdotsh/ejsb/releases)\n[![License](https://img.shields.io/github/license/ejsdotsh/ejsb?color=blue)](./LICENSES/MPL-2.0.txt)\n[![Contributors](https://img.shields.io/github/contributors/ejsdotsh/ejsb?logo=github)](https://github.com/ejsdotsh/ejsb/graphs/contributors)\n\n\u003e `ejsb` is a grandiose name for a simple command-line tool for ad-hoc management of my personal infrastructure.\n\n## Description\n\nWhat began as a personal fork of [Ansible-NAS](https://ansible-nas.io/) to replace FreeNAS, became an ad-hoc collection of learning, experimentation, and opinionated tooling that i've written to manage my personal infrastructure. This project is about learning and documenting what i've done to share knowledge.\n\n***...caution, this is a work in progress, breaking changes ahead...***\n\n### ejsb\n\n- a simple command-line tool written in Go, using Cobra, Viper, and Go-Resty\n\n### asb\n\n- [asb](asb): various Ansible playbooks and roles\n\n## Requirements\n\n- Go\n- Python\n\n## Acknowledgements\n\n- from Dave Barroso's most-excellent [Building Scalable Tooling](https://www.dravetech.com/presos/building_scalable_tooling/slides.html) presentation (*emphasis mine*):\n\n  \u003e ### Why do we want automation?\n  \u003e\n  \u003e #### Reliability\n  \u003e\n  \u003e - Does our software do what we claim it does?\n  \u003e - Can we change it without breaking anything?\n  \u003e - Test the interactions with the system from a user perspective *first*, then add tests to simulate (fixed) bugs\n  \u003e\n  \u003e #### Consistency\n  \u003e\n  \u003e - Avoid cognitive overhead which can lead to bugs, wasted time, and bikeshedding\n  \u003e - Adopt frameworks and best practices\n  \u003e   - ***Choose a framework and stick by it unless strictly necessary***\n  \u003e   - If you need external services, standardize and adopt them across the board (i.e., databases, message buses, etc)\n  \u003e   - Adopt a coding style (or an opinionated linter) to minimize arguments about style (i.e., black)\n  \u003e - The goal is to be able to collaborate on multiple projects without having to pay a very expensive context switch cost or waste time arguing about tabs vs spaces or MySQL vs postgres\n  \u003e\n  \u003e #### Maintainability\n  \u003e\n  \u003e - Readability\n  \u003e   - Code is read more often than it is written so optimize for reading\n  \u003e - Abstractions\n  \u003e   - Break down your code into different layers of abstraction\n  \u003e   - Each abstraction should be concerned about solving the problem presented in its layer\n  \u003e   - Each abstraction should provide a stable contract so other abstractions can consume it\n  \u003e   - Abstractions are good for the separation of concerns\n  \u003e     - Given the request of deploying a service, can my software identify which parts need to be configured and which parameters need to be set?\n  \u003e     - Given the right input, is my service generating the correct configuration?\n  \u003e     - Given some configuration, is my library able to deploy it correctly to the device?\n  \u003e - Developer's tooling\n  \u003e   - A developer should have tooling to:\n  \u003e     - Help write code\n  \u003e       - autocompletion, inline documentation, refactoring, etc...\n  \u003e     - Inspect and explore what the program is doing during its execution\n  \u003e     - Observe how the system behaves in production\n  \u003e\n  \u003e ### Speed is not a goal but a consequence\n\n- [khuedoan/homelab](https://github.com/khuedoan/homelab)\n- [Ansible-NAS](https://ansible-nas.io/)\n- [Ansible for DevOps](https://github.com/geerlingguy/ansible-for-devops)\n- [DebOps](https://docs.debops.org/en/stable-3.0/)\n\n## License\n\nThis project is licensed under the Apache-2.0 and MPL-2.0 Licenses — see the LICENSE files for details.\n\n\u003cdiv align=\"center\"\u003e\nMade with ❤️ by e.j. sahala\n\u003c/div\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fejsdotsh%2Fejsb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fejsdotsh%2Fejsb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fejsdotsh%2Fejsb/lists"}