{"id":34507370,"url":"https://github.com/sidoshi/karakeep-sync","last_synced_at":"2026-04-15T15:01:25.779Z","repository":{"id":317400143,"uuid":"1065784977","full_name":"sidoshi/karakeep-sync","owner":"sidoshi","description":"Sync links from Hacker News upvotes, Reddit Saves and more to Karakeep/Hoarder for centralized bookmark management","archived":false,"fork":false,"pushed_at":"2025-12-01T12:47:36.000Z","size":125,"stargazers_count":91,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-03-01T16:56:54.082Z","etag":null,"topics":["hoarder","karakeep","self-hosted"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"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/sidoshi.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-09-28T12:28:10.000Z","updated_at":"2026-02-21T08:56:24.000Z","dependencies_parsed_at":"2025-09-30T17:43:50.587Z","dependency_job_id":null,"html_url":"https://github.com/sidoshi/karakeep-sync","commit_stats":null,"previous_names":["sidoshi/karakeep-sync"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sidoshi/karakeep-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sidoshi%2Fkarakeep-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sidoshi%2Fkarakeep-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sidoshi%2Fkarakeep-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sidoshi%2Fkarakeep-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sidoshi","download_url":"https://codeload.github.com/sidoshi/karakeep-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sidoshi%2Fkarakeep-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31846423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T13:28:40.153Z","status":"ssl_error","status_checked_at":"2026-04-15T13:28:29.396Z","response_time":63,"last_error":"SSL_read: 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":["hoarder","karakeep","self-hosted"],"created_at":"2025-12-24T03:03:39.198Z","updated_at":"2026-04-15T15:01:25.766Z","avatar_url":"https://github.com/sidoshi.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# karakeep-sync\n\nA tool to sync links from various services to [Karakeep](https://github.com/hoarder-app/hoarder) to keep all your interesting links in one place.\n\n## Overview\n\nWhen looking up something interesting you found in the past, you probably check multiple places - Karakeep, HN upvotes, Reddit bookmarks, etc. This tool syncs all those links to Karakeep automatically, organizing them under lists for easy future access.\n\n## Supported Services\n\n- ✅ Hacker News upvotes\n- ✅ Reddit saved posts\n- ✅ Github stars\n- ✅ Pinboard bookmarks\n- 🚧 X bookmarks (planned)\n- 🚧 Bluesky bookmarks (planned)\n\n## Environment Variables\n\nConfigure these environment variables in your `docker-compose.yml`:\n\n| Variable           | Required | Description                                                       |\n| ------------------ | -------- | ----------------------------------------------------------------- |\n| `KS_KARAKEEP_AUTH` | ✅       | Your Karakeep API token                                           |\n| `KS_KARAKEEP_URL`  | ✅       | Your Karakeep instance URL (e.g., `https://karakeep.example.com`) |\n\n### For Hacker News\n\n| Variable         | Required | Description                                      |\n| ---------------- | -------- | ------------------------------------------------ |\n| `KS_HN_AUTH`     | ❌       | Your Hacker News authentication cookie value     |\n| `KS_HN_SCHEDULE` | ❌       | Sync schedule in cron format (default: `@daily`) |\n\nHacker news auth cookie can be obtained by logging into your HN account and inspecting the cookies in your browser. Look for the `user` cookie.\n\nHacker News upvotes will be synced to a list named `HN Upvoted` in your Karakeep instance.\n\nHacker News sync will be skipped if `KS_HN_AUTH` is not set.\n\n### For Reddit\n\n| Variable                 | Required | Description                                      |\n| ------------------------ | -------- | ------------------------------------------------ |\n| `KS_REDDIT_CLIENTID`     | ❌       | Your Reddit app client ID                        |\n| `KS_REDDIT_CLIENTSECRET` | ❌       | Your Reddit app client secret                    |\n| `KS_REDDIT_REFRESHTOKEN` | ❌       | Your Reddit app refresh token                    |\n| `KS_REDDIT_SCHEDULE`     | ❌       | Sync schedule in cron format (default: `@daily`) |\n\nTo obtain a refresh token, you can follow these steps:\n\n1. Create a Reddit app [here](https://www.reddit.com/prefs/apps) (choose \"script\" as the app type).\n2. You can use a tool like [this](https://github.com/not-an-aardvark/reddit-oauth-helper) to generate a refresh token using your app's client ID and client secret. Make sure that the redirect URI matches the one provided from reddit-oauth-helper.\n3. Make sure to give the app `history` scope access.\n4. Make sure to tick the \"permanent\" option to get a refresh token.\n\nIf you don't want to trust a third party tool, you can also implement the OAuth2 flow yourself using the [Reddit API docs](https://www.reddit.com/dev/api/).\n\nReddit saves will be synced to a list named `Reddit Saved` in your Karakeep instance.\n\nReddit sync will be skipped if any of `KS_REDDIT_CLIENTID`, `KS_REDDIT_CLIENTSECRET` or `KS_REDDIT_REFRESHTOKEN` is not set.\n\n### GitHub Stars\n\n| Variable             | Required | Description                                      |\n| -------------------- | -------- | ------------------------------------------------ |\n| `KS_GITHUB_TOKEN`    | ❌       | Your GitHub personal access token                |\n| `KS_GITHUB_SCHEDULE` | ❌       | Sync schedule in cron format (default: `@daily`) |\n\nTo obtain a GitHub personal access token, you can visit [this link](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens#creating-a-fine-grained-personal-access-token) and create a new token with `Starring` user permission (read).\n\nGitHub stars will be synced to a list named `GitHub Starred` in your Karakeep instance.\n\nGitHub sync will be skipped if `KS_GITHUB_TOKEN` is not set.\n\n### Pinboard Bookmarks\n\n| Variable               | Required | Description                                      |\n| ---------------------- | -------- | ------------------------------------------------ |\n| `KS_PINBOARD_TOKEN`    | ❌       | Your Pinboard API token                          |\n| `KS_PINBOARD_SCHEDULE` | ❌       | Sync schedule in cron format (default: `@daily`) |\n\nTo obtain your Pinboard API token, visit your [Pinboard password page](https://pinboard.in/settings/password) and scroll down to the \"API Token\" section. The token will be in the format `username:TOKEN`.\n\nPinboard bookmarks will be synced to a list named `Pinboard` in your Karakeep instance.\n\nPinboard sync will be skipped if `KS_PINBOARD_TOKEN` is not set.\n\n## Deployment\n\nCreate a `docker-compose.yml` file with the following content:\n\n```yaml\nservices:\n  karakeep-sync:\n    image: ghcr.io/sidoshi/karakeep-sync:latest\n    container_name: karakeep-sync\n    restart: unless-stopped\n    environment:\n      - KS_KARAKEEP_AUTH=\u003cyour_karakeep_auth_cookie\u003e # required\n      - KS_KARAKEEP_URL=\u003cyour_karakeep_instance_url\u003e # required\n\n      - KS_HN_AUTH=\u003cyour_hn_auth_cookie\u003e # optional\n      - KS_HN_SCHEDULE=@daily # optional Cron format, e.g., \"@hourly\", \"@daily\", \"0 0 * * *\" default is \"@daily\"\n\n      - KS_REDDIT_CLIENTID=\u003cyour_reddit_client_id\u003e # optional\n      - KS_REDDIT_CLIENTSECRET=\u003cyour_reddit_client_secret\u003e # optional\n      - KS_REDDIT_REFRESHTOKEN=\u003cyour_reddit_refresh_token\u003e # optional\n      - KS_REDDIT_SCHEDULE=@daily # optional Cron format, e.g., \"@hourly\", \"@daily\", \"0 0 * * *\" default is \"@daily\"\n\n      - KS_GITHUB_TOKEN=\u003cyour_github_personal_access_token\u003e # optional\n      - KS_GITHUB_SCHEDULE=@daily # optional Cron format, e.g., \"@hourly\", \"@daily\", \"0 0 * * *\" default is \"@daily\"\n\n      - KS_PINBOARD_TOKEN=\u003cyour_pinboard_api_token\u003e # optional\n      - KS_PINBOARD_SCHEDULE=@daily # optional Cron format, e.g., \"@hourly\", \"@daily\", \"0 0 * * *\" default is \"@daily\"\n```\n\nThen run:\n\n```bash\ndocker-compose up -d\n```\n\nYou can also add this service definition alongside your existing Hoarder/Karakeep services.\n\n## Contributing\n\nContributions are welcome! Please open issues or pull requests for any features, bug fixes, or improvements.\n\nTo add support for more services, implement the `Plugin` trait in a new module under `crates/sync/src/plugin/`. You can refer to the existing `hn_upvotes` and `reddit_saves` modules as examples. All plugins must be registered in `crates/sync/src/plugin.rs`. Make sure to add appropriate configuration options in `crates/sync/src/settings.rs`. Finally, update the documentation in this README to include the new service.\n\nSee this PR for adding GitHub stars support as an example: [#2](https://github.com/sidoshi/karakeep-sync/pull/2)\n\n## License\n\nMIT License. See `LICENSE` file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsidoshi%2Fkarakeep-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsidoshi%2Fkarakeep-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsidoshi%2Fkarakeep-sync/lists"}