{"id":20187980,"url":"https://github.com/arran4/gobookmarks","last_synced_at":"2026-05-20T02:04:59.159Z","repository":{"id":196810136,"uuid":"697090616","full_name":"arran4/gobookmarks","owner":"arran4","description":"Landing page for when you open browsers / live bookmarks in go.","archived":false,"fork":false,"pushed_at":"2026-02-19T11:20:37.000Z","size":9915,"stargazers_count":10,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-19T15:20:06.391Z","etag":null,"topics":["bookmarks","github","github-api","go","golang","home-page","homepage","live-bookmarks","start-page","startpage","web"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arran4.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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2023-09-27T03:16:27.000Z","updated_at":"2026-02-19T11:34:07.000Z","dependencies_parsed_at":null,"dependency_job_id":"29edfa31-8610-4eb3-a888-41f522eee31b","html_url":"https://github.com/arran4/gobookmarks","commit_stats":null,"previous_names":["arran4/gobookmarks"],"tags_count":94,"template":false,"template_full_name":null,"purl":"pkg:github/arran4/gobookmarks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arran4%2Fgobookmarks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arran4%2Fgobookmarks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arran4%2Fgobookmarks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arran4%2Fgobookmarks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arran4","download_url":"https://codeload.github.com/arran4/gobookmarks/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arran4%2Fgobookmarks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30212021,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T09:02:10.694Z","status":"ssl_error","status_checked_at":"2026-03-07T09:02:08.429Z","response_time":53,"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":["bookmarks","github","github-api","go","golang","home-page","homepage","live-bookmarks","start-page","startpage","web"],"created_at":"2024-11-14T03:26:52.416Z","updated_at":"2026-03-07T10:01:25.784Z","avatar_url":"https://github.com/arran4.png","language":"Go","funding_links":[],"categories":["Software"],"sub_categories":["Personal Dashboards"],"readme":"# gobookmarks\n\n![logo.png](logo.png)\n\n`gobookmarks` is a self-hosted personal landing page / start page that renders your bookmarks from a simple text file you own. Edit and store your data with visual tools or plain text, backed by Git (GitHub, GitLab, local Git, or SQL) so there is no lock-in and you always have history.\n\n![Screenshot_20250716_161941.png](media/Screenshot_20250716_161941.png)\n\n## Features\n\n- Multi-page, multi-tab layout defined in a straightforward plaintext format.\n- Visual editor for drag-and-drop reordering plus a full-text editor for quick bulk updates.\n- Search with keyboard navigation and shortcut dialog (`?`).\n- Git-backed history so you can roll back changes or browse previous versions.\n- Multiple authentication providers: database, local Git, GitHub, and GitLab.\n\n## Quick start\n\n### Docker\n\nRun the published image with environment variables for your OAuth credentials and external URL:\n\n```bash\ndocker run -p 8080:8080 \\\n  -v /my/cache:/var/cache/gobookmarks \\\n  -v /my/db:/var/lib/gobookmarks \\\n  -e EXTERNAL_URL=http://localhost:8080 \\\n  -e GITHUB_CLIENT_ID=abc \\\n  -e GITHUB_SECRET=def \\\n  -e FAVICON_CACHE_DIR=/var/cache/gobookmarks/favcache \\\n  -e LOCAL_GIT_PATH=/var/lib/gobookmarks/localgit \\\n  ghcr.io/arran4/gobookmarks\n```\n\n### Docker Compose\n\nUsing environment variables:\n\n```yaml\nversion: '3'\nservices:\n  gobookmarks:\n    image: ghcr.io/arran4/gobookmarks\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - cache:/var/cache/gobookmarks\n      - db:/var/lib/gobookmarks\n    environment:\n      EXTERNAL_URL: \"http://localhost:8080\"\n      GITHUB_CLIENT_ID: abc\n      GITHUB_SECRET: def\n      FAVICON_CACHE_DIR: /var/cache/gobookmarks/favcache\n      LOCAL_GIT_PATH: /var/lib/gobookmarks/localgit\nvolumes:\n  cache:\n  db:\n```\n\nUsing a config and env file:\n\n```yaml\nversion: '3'\nservices:\n  gobookmarks:\n    image: ghcr.io/arran4/gobookmarks\n    ports:\n      - \"8080:8080\"\n    volumes:\n      - ./config.json:/etc/gobookmarks/config.json:ro\n      - ./gobookmarks.env:/etc/gobookmarks/gobookmarks.env:ro\n      - cache:/var/cache/gobookmarks\n      - db:/var/lib/gobookmarks\nvolumes:\n  cache:\n  db:\n```\n\n### From releases\n\nDownload a precompiled binary from [GitHub Releases](https://github.com/arran4/gobookmarks/releases) or use the Docker image `ghcr.io/arran4/gobookmarks`. Service files for `systemd` and FreeBSD `rc.d` are included in the release packages.\n\n### Development build\n\n```bash\ngo run ./cmd/gobookmarks\n```\n\n## How to use\n\n![Screenshot_20250716_161715.png](media/Screenshot_20250716_161715.png)\n\n1. Sign up or log in using a database, local Git, GitHub, or GitLab. On first use the service creates a repository called `MyBookmarks` in your account containing a `bookmarks.txt` file such as:\n\n   ```text\n   Category: Search\n   http://www.google.com.au Google\n   Category: Wikis\n   http://en.wikipedia.org/wiki/Main_Page Wikipedia\n   http://mathworld.wolfram.com/ Math World\n   http://gentoo-wiki.com/Main_Page Gentoo-wiki\n   ```\n\n   ![Screenshot_20250716_162050.png](media/Screenshot_20250716_162050.png)\n\n2. Visit the URL where the app is deployed.\n3. Enjoy your new landing page / start page.\n\n## Bookmark file format\n\nEvery command must be on its own line; empty lines are ignored.\n\n| Code                     | Meaning                                                                                  |\n|--------------------------|------------------------------------------------------------------------------------------|\n| `Category[: \u003ccategory\u003e]` | Create a category title. If unnamed it displays as `Category`.                           |\n| `\u003cLink\u003e`                 | Create a link to `\u003cLink\u003e` with the display name `\u003cLink\u003e`.                                 |\n| `\u003cLink\u003e \u003cName\u003e`          | Create a link to `\u003cLink\u003e` with the display name `\u003cName\u003e`.                                 |\n| `Column`                 | Start a new column.                                                                      |\n| `Page[: \u003cname\u003e]`         | Create a new page and optionally name it.                                                |\n| `Tab[: \u003cname\u003e]`          | Start a new tab. Without a name it reverts to the main tab (switch using `/tab/\u003cindex\u003e`).|\n| `--`                     | Insert a horizontal rule and reset columns.                                              |\n\nTabs contain one or more pages. The first tab is implicit and does not need a `Tab` directive unless you want to name it. Each `Page` line begins a new page within the current tab.\n\nExample with two named columns:\n\n```text\nCategory: Left\nhttp://left.com\nColumn\nCategory: Right\nhttp://right.com\n```\n\n### Bigger example\n\n```text\nTab: Home Dashboard\nPage: Quick Links\nColumn\nCategory: Search Engines\nhttps://www.google.com              Google Search\nhttps://duckduckgo.com              DuckDuckGo\nhttps://bing.com                    Bing\nhttps://startpage.com               Startpage\n\nCategory: Version Control\nhttps://github.com                  GitHub\nhttps://gitlab.com                  GitLab\nhttps://github.com/arran4/blog      arran4 Blog\nhttps://github.com/arran4/dotfiles   arran4 Dotfiles\nhttps://bitbucket.org               Bitbucket\nhttps://sr.ht                       SourceHut\nhttps://gitea.com                   Gitea\nhttps://aws.amazon.com/codecommit   AWS CodeCommit\n\nColumn\nCategory: freeCodeCamp\nhttps://freecodecamp.org            freeCodeCamp\nhttps://forum.freecodecamp.org      freeCodeCamp Forum\n\nCategory: Coursera\nhttps://coursera.org                Coursera\nhttps://blog.coursera.org           Coursera Blog\n\nPage: Tools\nColumn\nCategory: Code Editors\nhttps://code.visualstudio.com       Visual Studio Code\nhttps://sublimetext.com             Sublime Text\nhttps://atom.io                     Atom\nhttps://www.jetbrains.com/idea      IntelliJ IDEA Community Edition\n\nColumn\nCategory: Terminal Emulators\nhttps://wezfurlong.org/wezterm      WezTerm\nhttps://kitty.black                 Kitty\nhttps://github.com/alacritty/alacritty  Alacritty\nhttps://hyper.is                    Hyper\n\nTab: UI Frameworks\nPage: Components\nColumn\nCategory: Libraries\nhttps://mui.com                     Material‑UI\nhttps://storybook.js.org            Storybook\nhttps://ant.design                  Ant Design\nhttps://chakra-ui.com               Chakra UI\n\nColumn\nCategory: Grid Guides\nhttps://css-tricks.com/snippets/css/complete-guide-grid   CSS‑Tricks Grid Guide\nhttps://getbootstrap.com/docs/5.0/layout/grid/            Bootstrap Grid Guide\nhttps://tailwindcss.com/docs/grid-template-columns       Tailwind CSS Grid Guide\n\nPage: Reference\nColumn\nCategory: MDN Web Docs\nhttps://developer.mozilla.org      MDN Web Docs\nhttps://caniuse.com                Can I Use\nhttps://www.w3.org/standards       W3C Standards\nhttps://devdocs.io                 DevDocs\n\nTab: Entertainment\nPage: Video\nColumn\nCategory: Videos\nhttps://youtube.com                YouTube\nhttps://netflix.com                Netflix\nhttps://primevideo.com             Prime Video\n\nColumn\nCategory: Tech News\nhttps://news.ycombinator.com       Hacker News\nhttps://arstechnica.com            Ars Technica\nhttps://techcrunch.com             TechCrunch\n\nPage: Podcasts\nColumn\nCategory: Podcasts\nhttps://talkpython.fm              Talk Python To Me\nhttps://developerhabits.com        Developer Habits\nhttps://syntax.fm                  Syntax.fm\n```\n\n## Editing\n\n### Visual editor\n\nThere is a visual editor that lets you rearrange links, categories, pages, and tabs. Use it for quick drag-and-drop adjustments; you can always fall back to the text editor for larger changes.\n\n![Screenshot_20250716_162044.png](media/Screenshot_20250716_162044.png)\n\n![media/simplescreenrecorder-2025-07-16_16.22.12.gif](media/simplescreenrecorder-2025-07-16_16.22.12.gif)\n \n![media/simplescreenrecorder-2025-07-16_16.22.19.gif](media/simplescreenrecorder-2025-07-16_16.22.19.gif)\n \n![media/simplescreenrecorder-2025-07-16_16.22.27.gif](media/simplescreenrecorder-2025-07-16_16.22.27.gif)\n \n![media/simplescreenrecorder-2025-07-16_16.22.51.gif](media/simplescreenrecorder-2025-07-16_16.22.51.gif)\n\n### Edit as text\n\nThe `/edit` page allows updating the entire bookmark file. Each category heading includes a pencil icon that opens `/editCategory`, which shows only that category and saves changes back to your bookmarks. Edits check the file's SHA so you'll get an error if it changed while you were editing.\n\n![Screenshot_20250716_162050.png](media/Screenshot_20250716_162050.png)\n\n## History\n\nAll providers maintain git-like history so you can browse or roll back to any previous state.\n\n![Screenshot_20250716_162105.png](media/Screenshot_20250716_162105.png)\n\n## Search\n\nYou can quickly search for any link on the same tab you're on (tabs contain pages). Keyboard navigation is supported—use the arrow keys to move through results. Press **Enter** to open the selected link, **Shift+Enter** for a background tab, and hold **Alt** to keep the entered text.\n\n[![media/simplescreenrecorder-2025-07-16_16.23.20.gif](media/simplescreenrecorder-2025-07-16_16.23.20.gif)](media/simplescreenrecorder-2025-07-16_16.23.20.gif)\n\n### Search widgets\n\nUse a link starting with the `search:` scheme followed by a URL containing `$query`, for example:\n\n```\nsearch:https://www.google.com/search?q=$query\n```\n\n![Screencast_20250723_111959.webm.gif](media/Screencast_20250723_111959.webm.gif)\n\n## Keyboard shortcuts\n\n- **Alt+K** or **Ctrl+K**/**Cmd+K** focuses the search box and selects any existing text.\n- **Alt+{** and **Alt+}** switch between bookmark tabs.\n- **Alt+[** and **Alt+]** switch between pages within a tab.\n- While the search box is focused, **Up/Down** or **Left/Right** arrows move between filtered results. Press **Enter** to open the selected link or **Ctrl+Enter**/**Meta+Enter** to open it in a background tab.\n- Pressing **Esc** inside the search field removes focus. Pressing **Esc** again clears the search and restores the previous view. Search widgets use the same pattern, with a third **Esc** press clearing all widget text.\n- Press **?** anywhere (outside of a text field) to see these shortcuts in a small help dialog.\n\n## Configuration\n\nConfiguration values can be supplied as environment variables, via a JSON configuration file, or using command line arguments. Environment variables are the lowest priority, followed by the configuration file, then command line arguments. If `/etc/gobookmarks/gobookmarks.env` exists it will be loaded before reading the environment.\n\n| Name | Description |\n| --- | --- |\n| `EXTERNAL_URL` | Fully qualified URL the service is reachable on, e.g. `http://localhost:8080`. |\n| `GITHUB_CLIENT_ID` / `GITHUB_SECRET` | GitHub OAuth2 client ID and secret. |\n| `GITLAB_CLIENT_ID` / `GITLAB_SECRET` | GitLab OAuth2 client ID and secret. |\n| `GITHUB_SERVER` | Base URL for GitHub (set for GitHub Enterprise). |\n| `GITLAB_SERVER` | Base URL for GitLab (self-hosted). |\n| `LOCAL_GIT_PATH` | Directory used for the local git provider. Defaults to `/var/lib/gobookmarks/localgit` when installed system-wide (including the Docker image). |\n| `DB_CONNECTION_PROVIDER` | SQL driver name for the SQL provider (`mysql` or `sqlite3`). |\n| `DB_CONNECTION_STRING` | Connection string for the SQL provider. File path for `sqlite3` or `user:pass@/database?multiStatements=true` for MySQL. |\n| `SESSION_KEY` | Secret used to sign session cookies. If unset the program reads or creates `session.key` under `$XDG_STATE_HOME/gobookmarks`, `$HOME/.local/state/gobookmarks`, or `/var/lib/gobookmarks`. |\n| `PROVIDER_ORDER` | Comma-separated list controlling the order login options are shown. Unrecognized names are ignored; defaults to alphabetical order. |\n| `GBM_CSS_COLUMNS` | If set (to any value) the `Column` keyword is rendered using a flex-based layout that emulates table positioning. |\n| `GBM_NAMESPACE` | Optional suffix added to the bookmarks repository name. |\n| `GBM_TITLE` | Overrides the page title shown in the browser. |\n| `GBM_NO_FOOTER` | Hide footer on pages. |\n| `GBM_DEV_MODE` | Enable developer helpers like `/_css` and `/_table`. Defaults to on when built as `dev`. |\n| `FAVICON_CACHE_DIR` | Directory where fetched favicons are stored. If unset icons are kept only in memory. Defaults to `/var/cache/gobookmarks/favcache` when installed system-wide (including the Docker image). |\n| `FAVICON_CACHE_SIZE` | Maximum size in bytes of the favicon cache before old icons are removed. Defaults to `20971520`. |\n| `GOBM_ENV_FILE` | Path to a file of `KEY=VALUE` pairs loaded before the environment. Defaults to `/etc/gobookmarks/gobookmarks.env`. |\n| `GOBM_CONFIG_FILE` | Path to the JSON config file. If unset the program uses `$XDG_CONFIG_HOME/gobookmarks/config.json` or `$HOME/.config/gobookmarks/config.json` for normal users and `/etc/gobookmarks/config.json` when installed system-wide or run as root. |\n\nUse `--config \u003cpath\u003e` or set `GOBM_CONFIG_FILE` to control which configuration file is loaded.\n\n### Command-line reference\n\n- `--config \u003cpath\u003e` or `GOBM_CONFIG_FILE` chooses the configuration file to load.\n- `--title \u003ctext\u003e` or `GBM_TITLE` sets the browser page title.\n- `--no-footer` or `GBM_NO_FOOTER` hides the footer on pages.\n- `--dev-mode` or `GBM_DEV_MODE` toggles developer helpers like `/_css` and `/_table`.\n- `--github-server \u003curl\u003e` or `GITHUB_SERVER` overrides the GitHub base URL; `--gitlab-server \u003curl\u003e` or `GITLAB_SERVER` does the same for GitLab.\n- `--provider-order \u003clist\u003e` or `PROVIDER_ORDER` customizes the login button order.\n- `--dump-config` prints the final configuration after merging environment variables, the config file, and command line arguments.\n- `--version` prints version information and the list of compiled-in providers.\n\nWhen no OAuth2 credentials are configured the login buttons are hidden. Visit `/status` to see which providers are available.\n\n## OAuth2 setup\n\nFor GitHub visit \u003chttps://github.com/settings/developers\u003e. For GitLab visit \u003chttps://gitlab.com/-/profile/applications\u003e.\n\nCreate an application and set the callback URL to `\u003cEXTERNAL_URL\u003e/oauth2Callback` (for example `http://localhost:8080/oauth2Callback`). Upload `logo.png` for the logo and use the generated client ID and secret for the environment variables.\n\n## Running as a service\n\nThe release packages include service files for both `systemd` and FreeBSD `rc.d`. During installation these files can be copied to your system so the server starts automatically on boot. The service files pass `--config /etc/gobookmarks/config.json` and install an example config file with permissions `0600` owned by the `gobookmarks` user (created during installation).\n\n## Docker details\n\nThe Docker image uses an Alpine base image. Mount `/var/cache/gobookmarks` if you need persistent storage for favicons and `/var/lib/gobookmarks` for the git provider. The git provider stores data under `$LOCAL_GIT_PATH/\u003csha256(username)\u003e/` as a git repository with a `.password` file containing the bcrypt hash. Create an account via `/signup/git` and log in via `/login/git`. Passwords can be updated with the provider's SetPassword method.\n\nTo locate the password file, compute the SHA-256 of your username and look for the corresponding directory, for example:\n\n```bash\necho -n alice | sha256sum\n```\n\nThe optional SQL provider stores bookmarks and passwords in a database when `DB_CONNECTION_PROVIDER` and `DB_CONNECTION_STRING` are set. Accounts are created through `/signup/sql` and log in via `/login/sql`. Only the latest bookmarks are returned; commit history is maintained in the `history` table.\n\nYou can also mount a config file and environment file:\n\n```bash\ndocker run -v /my/config.json:/etc/gobookmarks/config.json \\\n           -v /my/gobookmarks.env:/etc/gobookmarks/gobookmarks.env \\\n           -v /my/cache:/var/cache/gobookmarks \\\n           -v /my/db:/var/lib/gobookmarks \\\n           -p 8080:8080 ghcr.io/arran4/gobookmarks\n```\n\nAn example `config.json` looks like:\n\n```json\n{\n  \"github_client_id\": \"\",\n  \"github_secret\": \"\",\n  \"gitlab_client_id\": \"\",\n  \"gitlab_secret\": \"\",\n  \"external_url\": \"http://localhost:8080\",\n  \"css_columns\": false,\n  \"namespace\": \"\",\n  \"title\": \"\",\n  \"no_footer\": false,\n  \"github_server\": \"https://github.com\",\n  \"gitlab_server\": \"https://gitlab.com\",\n  \"favicon_cache_dir\": \"/var/cache/gobookmarks/favcache\",\n  \"favicon_cache_size\": 20971520,\n  \"local_git_path\": \"/var/lib/gobookmarks/localgit\",\n  \"db_connection_provider\": \"sqlite3\",\n  \"db_connection_string\": \"/var/lib/gobookmarks/bookmarks.db\",\n  \"no_footer\": false\n}\n```\n\n## Legacy migration\n\nThe `sql/legacy_migrate.sql` file contains SQL statements that convert the original `goa4web-bookmarks` tables into the schema used here. Execute the script manually on your database before enabling the SQL provider.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farran4%2Fgobookmarks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farran4%2Fgobookmarks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farran4%2Fgobookmarks/lists"}