{"id":29064518,"url":"https://github.com/ducks/ducks","last_synced_at":"2026-02-27T17:13:21.345Z","repository":{"id":300456158,"uuid":"1005841828","full_name":"ducks/ducks","owner":"ducks","description":null,"archived":false,"fork":false,"pushed_at":"2026-01-12T22:37:38.000Z","size":9,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-13T02:47:56.851Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"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/ducks.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-20T23:30:29.000Z","updated_at":"2026-01-12T22:37:42.000Z","dependencies_parsed_at":"2025-06-21T20:26:40.370Z","dependency_job_id":"90329892-04bc-400f-8448-9066a16c4738","html_url":"https://github.com/ducks/ducks","commit_stats":null,"previous_names":["ducks/ducks"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ducks/ducks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ducks%2Fducks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ducks%2Fducks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ducks%2Fducks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ducks%2Fducks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ducks","download_url":"https://codeload.github.com/ducks/ducks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ducks%2Fducks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29905776,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-27T14:46:13.553Z","status":"ssl_error","status_checked_at":"2026-02-27T14:46:10.522Z","response_time":57,"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":"2025-06-27T09:07:15.547Z","updated_at":"2026-02-27T17:13:21.340Z","avatar_url":"https://github.com/ducks.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003clink rel=\"me\" href=\"https://hachyderm.io/@ducks\" /\u003e\n\n# whoami\n\nSoftware engineer who enjoys working on developer tooling, backend services,\nobservability infrastructure, and distributed systems.\n\n\n## tech\n\n\u003cdiv\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/nodejs/nodejs-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/typescript/typescript-original.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/rust/rust-original.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/ruby/ruby-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/python/python-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/rails/rails-plain-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/react/react-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/docker/docker-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/postgresql/postgresql-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/linux/linux-original.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/nixos/nixos-original.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/bash/bash-original.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/vim/vim-original.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/kubernetes/kubernetes-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/terraform/terraform-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/git/git-original-wordmark.svg\" width=\"100\" /\u003e\n\u003cimg src=\"https://cdn.jsdelivr.net/gh/devicons/devicon@latest/icons/prometheus/prometheus-plain-wordmark.svg\" width=\"100\" /\u003e\n\u003c/div\u003e\n\n## recent projects\n\n### llm-mux - LLM Multiplexer\n\nRoute prompts to multiple LLM backends, run them in parallel, and orchestrate multi-step workflows:\n\n- CLI and HTTP backends (Claude, Codex, Gemini, Ollama, OpenAI-compatible APIs)\n- Parallel, first, and fallback execution modes per role\n- Declarative TOML workflows with step dependencies and variable interpolation\n- Shell, query, apply, and store step types\n- Ecosystem memory: persist and query LLM analysis across projects via SQLite\n\n[repo](https://github.com/ducks/llm-mux)\n[crates.io](https://crates.io/crates/llm-mux)\n\n### Scrob - Self-Hosted Music Scrobbling\n\nSelf-hosted alternative to Last.fm with public profile pages:\n\n- Built with Rust, Axum, and PostgreSQL\n- Token-based authentication with bcrypt password hashing\n- RESTful API for submitting scrobbles from music players\n- Public profile pages showing listening history and stats\n- Embedded migrations via sqlx\n- Designed for single-user or small community deployment\n\n[repo](https://github.com/ducks/scrob)\n[blog post](https://jakegoldsborough.com/blog/2026/building-scrob-self-hosted-scrobbling/)\n\n### pond-nix - Declarative VPS Infrastructure\n\nNixOS-based infrastructure management for personal services:\n\n- Manages Gitea, Woodpecker CI, Scrob, GoatCounter (3 instances), Caddy\n- Fully declarative configuration with atomic rollbacks\n- Reproducible builds and deployments via Nix\n- Service definitions in version control\n- Simple deployment: `nixos-rebuild switch`\n- Migration from manual systemd setup to declarative NixOS\n\n[repo](https://github.com/ducks/pond-nix)\n[blog post](https://jakegoldsborough.com/blog/2026/real-declarative-infrastructure-nixos/)\n\n### JOBL + SRG - Structured Resume Tooling\n\nA TOML-based resume format with strict validation and static generation:\n\n- **JOBL**: Structured resume specification with version-aware parsing\n- Type-safe validation with comprehensive error reporting\n- Portable `.jobl` files for version control and collaboration\n- **SRG**: Static generator converting JOBL to HTML and PDF\n- Clean, professional templates optimized for screen and print\n\n[JOBL repo](https://github.com/ducks/JOBL)\n[SRG repo](https://github.com/ducks/SRG)\n\n### Yaks - Virtual Currency for Discourse\n\nA Discourse plugin implementing spendable in-forum currency:\n\n- Topic pinning, boosting, and custom flair purchases\n- Background jobs for transaction processing\n- Integration with Discourse's user system and permissions\n- Custom admin interface for currency management\n\n[repo](https://github.com/ducks/discourse-yaks)\n[part 1](https://jakegoldsborough.com/blog/2025/building-yaks-virtual-currency-part-1/)\n[part 2](https://jakegoldsborough.com/blog/2025/building-yaks-virtual-currency-part-2/)\n[part 3](https://jakegoldsborough.com/blog/2025/building-yaks-virtual-currency-part-3/)\n[part 4](https://jakegoldsborough.com/blog/2025/building-yaks-virtual-currency-part-4/)\n\n### Shelltrax - TUI Music Player\n\nLightweight terminal-based music player inspired by cmus:\n\n- Smart metadata handling with directory-based album grouping\n- Filename fallbacks for missing ID3 tags\n- ZIP import for extracting albums from compressed files\n- Search functionality with fuzzy matching\n- Playback controls with autoplay and repeat modes\n- macOS compatibility\n\n[repo](https://github.com/ducks/shelltrax)\n[blog post](https://jakegoldsborough.com/blog/2025/introducing-shelltrax/)\n\n### Shellcast - TUI Podcast Player\n\nTerminal-based podcast player with RSS/Atom feed support:\n\n- Built with ratatui and crossterm\n- Podcast discovery via gpodder.net integration\n- Episode playback with ALSA/CPAL audio backend\n- Feed refresh and episode tracking\n- Pause/resume with proper state management\n- Persistent library storage\n\n[repo](https://github.com/ducks/shellcast)\n\n## Interests\n\n- Rust (TUI development, audio processing, systems programming)\n- TypeScript, Node.js\n- Ruby on Rails \u0026 Discourse plugin development\n- Systems design \u0026 distributed systems\n- Observability \u0026 monitoring (Prometheus, metrics exporters)\n- Infrastructure automation (Docker, CI/CD, Makefiles)\n- Developer tooling \u0026 CLI applications\n- Music metadata standards (ID3, RSS/Atom feeds)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fducks%2Fducks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fducks%2Fducks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fducks%2Fducks/lists"}