{"id":15512408,"url":"https://github.com/willnet/revenger","last_synced_at":"2026-02-26T17:04:43.295Z","repository":{"id":17816387,"uuid":"20712648","full_name":"willnet/revenger","owner":"willnet","description":"復習用メモサービス","archived":false,"fork":false,"pushed_at":"2026-02-15T06:18:01.000Z","size":1167,"stargazers_count":6,"open_issues_count":14,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-15T12:58:17.517Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://revenger.in/","language":"CSS","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/willnet.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}},"created_at":"2014-06-11T04:53:06.000Z","updated_at":"2026-02-15T06:18:03.000Z","dependencies_parsed_at":"2022-09-05T18:12:40.445Z","dependency_job_id":null,"html_url":"https://github.com/willnet/revenger","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/willnet/revenger","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Frevenger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Frevenger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Frevenger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Frevenger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/willnet","download_url":"https://codeload.github.com/willnet/revenger/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/willnet%2Frevenger/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29865431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-26T16:38:37.846Z","status":"ssl_error","status_checked_at":"2026-02-26T16:37:58.932Z","response_time":89,"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-02T09:53:38.004Z","updated_at":"2026-02-26T17:04:43.283Z","avatar_url":"https://github.com/willnet.png","language":"CSS","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# Revenger\n\nRevenger is for reviewing your notes frequently.\n\n## Set up for development\n\n- use devcontainers\n\n## Develop with Git Worktree\n\nUse `bin/dc` to run Dev Container commands. It automatically derives `COMPOSE_PROJECT_NAME`\nand `PORT` from the current worktree path, so containers/volumes/ports do not conflict\nacross worktrees.\n\n```sh\n# Example: create a new worktree\ngit worktree add ../revenger-feature-a feature-a\n\n# In each worktree directory\nbin/dc up --workspace-folder .\nbin/dc exec --workspace-folder . bin/setup\nbin/dc exec --workspace-folder . bin/dev\n```\n\nThe default port range is `3000-3199` and is selected automatically per worktree.\n\nIf you need to clean up existing resources for the current worktree:\n\n```sh\neval \"$(bin/devcontainer-env --export)\"\ndocker compose -f .devcontainer/compose.yaml down -v\n```\n\n## SQLite backup with Litestream (S3)\n\nProduction continuously replicates both SQLite databases to S3 using Litestream:\n\n- `/rails/storage/production.sqlite3`\n- `/rails/storage/production_queue.sqlite3`\n\nRequired production secret:\n\n- `RAILS_MASTER_KEY`\n\nConfigure Litestream settings in Rails credentials:\n\n```yaml\nlitestream:\n  replica_bucket: your-s3-bucket-name\n  replica_path_prefix: revenger-production\n  replica_region: ap-northeast-1\n  replica_key_id: \u003cAWS_ACCESS_KEY_ID\u003e\n  replica_access_key: \u003cAWS_SECRET_ACCESS_KEY\u003e\n```\n\n### Restore runbook (latest snapshot)\n\n1. Stop the app container so SQLite files are not being written.\n2. Move or delete existing DB files:\n   - `/rails/storage/production.sqlite3`\n   - `/rails/storage/production_queue.sqlite3`\n3. Restore primary DB:\n   - `bin/rails litestream:restore -- --database=/rails/storage/production.sqlite3 --if-db-not-exists`\n4. Restore queue DB:\n   - `bin/rails litestream:restore -- --database=/rails/storage/production_queue.sqlite3 --if-db-not-exists`\n5. Start the app container.\n\nNotes:\n\n- `--if-db-not-exists` skips restore when the DB file already exists.\n- If restore fails because a DB file exists, remove/rename the file and retry.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillnet%2Frevenger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwillnet%2Frevenger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwillnet%2Frevenger/lists"}