{"id":13554558,"url":"https://github.com/beakerbrowser/homebase","last_synced_at":"2025-04-03T07:31:44.953Z","repository":{"id":48666018,"uuid":"127587000","full_name":"beakerbrowser/homebase","owner":"beakerbrowser","description":"Self-deployable tool for hosting hyper:// websites","archived":true,"fork":false,"pushed_at":"2020-09-29T22:25:24.000Z","size":375,"stargazers_count":408,"open_issues_count":27,"forks_count":32,"subscribers_count":29,"default_branch":"master","last_synced_at":"2025-03-17T20:34:02.744Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/beakerbrowser.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}},"created_at":"2018-04-01T01:48:36.000Z","updated_at":"2025-01-13T13:11:13.000Z","dependencies_parsed_at":"2022-09-07T00:50:38.836Z","dependency_job_id":null,"html_url":"https://github.com/beakerbrowser/homebase","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerbrowser%2Fhomebase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerbrowser%2Fhomebase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerbrowser%2Fhomebase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerbrowser%2Fhomebase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beakerbrowser","download_url":"https://codeload.github.com/beakerbrowser/homebase/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246956520,"owners_count":20860451,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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-08-01T12:02:50.411Z","updated_at":"2025-04-03T07:31:44.653Z","avatar_url":"https://github.com/beakerbrowser.png","language":"JavaScript","funding_links":["https://opencollective.com/beaker","https://opencollective.com/beaker/backer/0/website","https://opencollective.com/beaker/backer/1/website","https://opencollective.com/beaker/backer/2/website","https://opencollective.com/beaker/backer/3/website","https://opencollective.com/beaker/backer/4/website","https://opencollective.com/beaker/backer/5/website","https://opencollective.com/beaker/backer/6/website","https://opencollective.com/beaker/backer/7/website","https://opencollective.com/beaker/backer/8/website","https://opencollective.com/beaker/backer/9/website","https://opencollective.com/beaker/backer/10/website","https://opencollective.com/beaker/backer/11/website","https://opencollective.com/beaker/backer/12/website","https://opencollective.com/beaker/backer/13/website","https://opencollective.com/beaker/backer/14/website","https://opencollective.com/beaker/backer/15/website","https://opencollective.com/beaker/backer/16/website","https://opencollective.com/beaker/backer/17/website","https://opencollective.com/beaker/backer/18/website","https://opencollective.com/beaker/backer/19/website","https://opencollective.com/beaker/backer/20/website","https://opencollective.com/beaker/backer/21/website","https://opencollective.com/beaker/backer/22/website","https://opencollective.com/beaker/backer/23/website","https://opencollective.com/beaker/backer/24/website","https://opencollective.com/beaker/backer/25/website","https://opencollective.com/beaker/backer/26/website","https://opencollective.com/beaker/backer/27/website","https://opencollective.com/beaker/backer/28/website","https://opencollective.com/beaker/backer/29/website","https://opencollective.com/beaker/backer/30/website","https://opencollective.com/beaker/backer/31/website","https://opencollective.com/beaker/backer/32/website","https://opencollective.com/beaker/backer/33/website","https://opencollective.com/beaker/backer/34/website","https://opencollective.com/beaker/backer/35/website","https://opencollective.com/beaker/backer/36/website","https://opencollective.com/beaker/backer/37/website","https://opencollective.com/beaker/backer/38/website","https://opencollective.com/beaker/backer/39/website","https://opencollective.com/beaker/backer/40/website","https://opencollective.com/beaker/backer/41/website","https://opencollective.com/beaker/backer/42/website","https://opencollective.com/beaker/backer/43/website","https://opencollective.com/beaker/backer/44/website","https://opencollective.com/beaker/backer/45/website","https://opencollective.com/beaker/backer/46/website","https://opencollective.com/beaker/backer/47/website","https://opencollective.com/beaker/backer/48/website","https://opencollective.com/beaker/backer/49/website","https://opencollective.com/beaker/backer/50/website","https://opencollective.com/beaker/backer/51/website","https://opencollective.com/beaker/backer/52/website","https://opencollective.com/beaker/backer/53/website","https://opencollective.com/beaker/backer/54/website","https://opencollective.com/beaker/backer/55/website","https://opencollective.com/beaker/backer/56/website","https://opencollective.com/beaker/backer/57/website","https://opencollective.com/beaker/backer/58/website","https://opencollective.com/beaker/backer/59/website","https://opencollective.com/beaker/backer/60/website","https://opencollective.com/beaker/backer/61/website","https://opencollective.com/beaker/backer/62/website","https://opencollective.com/beaker/backer/63/website","https://opencollective.com/beaker/backer/64/website","https://opencollective.com/beaker/backer/65/website","https://opencollective.com/beaker/backer/66/website","https://opencollective.com/beaker/backer/67/website","https://opencollective.com/beaker/backer/68/website","https://opencollective.com/beaker/backer/69/website","https://opencollective.com/beaker/backer/70/website","https://opencollective.com/beaker/backer/71/website","https://opencollective.com/beaker/backer/72/website","https://opencollective.com/beaker/backer/73/website","https://opencollective.com/beaker/backer/74/website","https://opencollective.com/beaker/backer/75/website"],"categories":["JavaScript","others"],"sub_categories":[],"readme":"# homebase\n\n`homebase` is a self-deployable tool for managing websites published with the [Hypercore protocol](https://hypercore-protocol.org/).\n\n`homebase` is for you if:\n\n- You're comfortable with some server administration (or want to learn!)\n- You want to keep your hyper:// website/s online\n- You want to publish your hyper:// website/s to http://\n\n## Table of contents\n\n- [Install](#install)\n- [Running homebase](#running-homebase)\n- [Examples](#examples)\n- [Configuration](#configuration)\n- [Advanced examples](#advanced-examples)\n- [Troubleshooting](#troubleshooting)\n- [Support](#support)\n- [Web API Clients](#web-api-clients)\n- [Changelog](#changelog)\n\n## Install\n\nIf you already have [Node.js](https://nodejs.org) (12.0+) and [npm](https://npmjs.com) installed on your server, get started by installing Homebase with npm or [npx](https://github.com/zkat/npx).\n\n```bash\nnpm install -g @beaker/homebase\n```\n\nOtherwise, install Node.js and npm first:\n\n- [Install Node.js](https://nodejs.org/en/download/)\n- [nvm](https://github.com/creationix/nvm) for managing Node versions\n- [Fixing npm permissions problems](https://docs.npmjs.com/getting-started/fixing-npm-permissions)\n\nHaving trouble installing? See [Troubleshooting](#troubleshooting).\n\n## Running homebase\n\nTo run `homebase` manually, simply invoke the `homebase` command:\n\n```bash\nhomebase\n```\n\nTo keep `homebase` running, you'll need to daemonize it. We like using [pm2](https://www.npmjs.com/package/pm2).\n\n```bash\n# install pm2\nnpm i -g pm2\n\n# start homebase with pm2\npm2 start homebase\n```\n\nTo stop the daemon, run:\n\n```\n# stop homebase\npm2 stop homebase\n```\n\n### Command line flags\n\n- `--config \u003cpath\u003e`\n  - Use the config file at the given path instead of the default `~/.homebase.yml`. Overrides the value of the HOMEBASE_CONFIG env var.\n\n### Environment variables\n\n- `HOMEBASE_CONFIG=cfg_file_path`\n  - Specify an alternative path to the config than `~/.homebase.yml`\n- `NODE_ENV=debug|staging|production`\n  - Set to debug or staging to use the Let's Encrypt testing servers.\n\n## Examples\n\n`homebase` uses a [configuration file](#configuration-file) (`~/.homebase.yml` by default) for managing its behavior. These examples show various configurations.\n\n[See all configuration options](#configuration)\n\n### Example: set up a hyperdrive with HTTP mirroring\n\nThis configuration file will host the files at `hyper://123...456` and mirror those files to `http://alice.com`.\n\nThis example uses a domain name, so in order for the domain name to resolve correctly, you'll need to update your DNS configuration first. In this case, you could set an `A` record that points to the `homebase` server's IP address.\n\n```yaml\nhyperdrives:\n  - url: hyper://123...456\n    domains:\n      - alice.com\nhttpMirror: true\n```\n\n### Example: host multiple websites, with no HTTP mirroring\n\nThis configuration simply hosts the files at `hyper://123...456` and `hyper:///456...789`. No domain name is required for this configuration.\n\n```yaml\nhyperdrives:\n  - url: hyper://123...456\n  - url: hyper://456...789\n```\n\n## Configuration\n\n- [Configuration file](#configuration-file)\n- [dashboard](#dashboard)\n  - [dashboard.port](#dashboardport)\n- [hyperdrives](#hyperdrives)\n  - [hyperdrives.*.url](#hyperdrivesurl)\n  - [hyperdrives.*.domains](#hyperdrivesdomains)\n- [directory](#directory)\n- [domain](#domain)\n- [httpMirror](#httpmirror)\n- [ports](#ports)\n  - [ports.http](#portshttp)\n- [proxies](#proxies)\n  - [proxies.*.from](#proxiesfrom)\n  - [proxies.*.to](#proxiesto)\n- [redirects](#redirects)\n  - [redirects.*.from](#redirectsfrom)\n  - [redirects.*.to](#redirectsto)\n\n### Configuration file\n\n`homebase` uses `~/.homebase.yml` as its default configuration file. You can specify an alternative config file using a [command line flag](#command-line-flags) or an [environment variable](#environment-variables).\n\n\n```yaml\ndirectory: ~/.homebase # where your data will be stored\nhttpMirror: true       # enables HTTP mirroring\nports:\n  http: 80             # HTTP port for redirects or non-TLS serving\ndashboard:             # set to false to disable\n  port: 8089           # port for accessing the metrics dashboard\n\n# enter your hosted hyperdrives here\nhyperdrives:\n  - url:               # URL of the hyperdrive to be hosted\n    domains:           # (optional) the domains of the hyperdrive\n\n# enter any proxied routes here\nproxies:\n  - from:              # the domain to accept requests from\n    to:                # the domain (\u0026 port) to target\n\n# enter any redirect routes here\nredirects:\n  - from:              # the domain to accept requests from\n    to:                # the domain to redirect to\n```\n\n### dashboard\n\nDefault `false`\n\nSet to `true` to enable the [Prometheus metrics dashboard](#example-using-a-metrics-dashboard).\n\n```yaml\ndashboard:             # set to false to disable\n  port: 8089           # port for accessing the metrics dashboard\n```\n\n#### dashboard.port\n\nDefault: `8089`\n\nThe port to serve the [Prometheus metrics dashboard](#example-using-a-metrics-dashboard).\n\n### hyperdrives\n\nA listing of the Hyperdrives to host.\n\n```yaml\nhyperdrives:\n  - url: hyper://1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03/\n    domains:\n      - mysite.com\n      - my-site.com\n```\n\n#### hyperdrives.*.url\n\nThe Hyperdrive URL of the site to host. Should be a 'raw' hyper url (no DNS hostname).\n\nExample values:\n\n```\n# raw key\n1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03\n\n# URL with trailing slash\nhyper://1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03/\n\n# URL with no trailing slash\nhyper://1f968afe867f06b0d344c11efc23591c7f8c5fb3b4ac938d6000f330f6ee2a03\n```\n\n#### hyperdrives.*.domains\n\nAdditional domains of the Hyperdrive. Can be a string or a list of strings. Each string should be a domain name.\n\nTo use `hyperdrives.*.domains`, you'll first need to configure the DNS entry for your domain name to point to your server. For instance, to point `alice.com` with `homebase`, you'll need to update your DNS configuration to point `alice.com` to your homebase server's IP address.\n\nExample values:\n\n```\nmysite.com\nfoo.bar.edu\nbest-site-ever.link\n```\n\n### directory\n\nDefault:  `~/.homebase`\n\nThe directory where `homebase` will store your data.\n\n### domain\n\n**DEPRECATED**. See the [v2.0.0 migration guide](#migrating-to-v2-0-0).\n\nThe DNS domain of your homebase instance.\n\n### httpMirror\n\nDefault: `false`\n\nSet to `true` to provide http mirroring of your Hyperdrives.\n\n### ports\n\nThe ports for HTTP.\n\n```yaml\nports:\n  http: 80\n```\n\n#### ports.http\n\nDefault: `80`\n\nThe port for serving HTTP sites.\n\n### proxies\n\nA listing of domains to proxy. Useful when your server has other services running that you need available.\n\n```yaml\nproxies:\n  - from: my-proxy.com\n    to: http://localhost:8080\n```\n\n#### proxies.*.from\n\nThe domain to proxy from. Should be a domain name.\n\nExample values:\n\n```\nmysite.com\nfoo.bar.edu\nbest-site-ever.link\n```\n\n#### proxies.*.to\n\nThe protocol, domain, and port to proxy to. Should be an [origin](https://en.wikipedia.org/wiki/Same-origin_policy#Origin_determination_rules).\n\nExample values:\n\n```\nhttps://mysite.com/\nhttp://localhost:8080/\nhttp://127.0.0.1:123/\n```\n\n### redirects\n\nA listing of domains to redirect.\n\n```yaml\nredirects:\n  - from: my-old-site.com\n    to: https://my-site.com\n```\n\n#### redirects.*.from\n\nThe domain to redirect from. Should be a domain name.\n\nExample values:\n\n```\nmysite.com\nfoo.bar.edu\nbest-site-ever.link\n```\n\n#### redirects.*.to\n\nThe base URL to redirect to. Should be an [origin](https://en.wikipedia.org/wiki/Same-origin_policy#Origin_determination_rules).\n\nExample values:\n\n```\nhttps://mysite.com/\nhttp://localhost:8080/\nhttp://127.0.0.1:123/\n```\n\n## Advanced examples\n\n### Example: proxies\n\nIf your `homebase` instance is running on ports 80/443, and you have other Web servers running on your server, you might need `homebase` to proxy to those other servers. You can do that with the `proxies` config. Here's an example proxy rule:\n\n[See full `proxies` reference](#proxies)\n\n```yaml\nproxies:\n  - from: my-proxy.com\n    to: http://localhost:8080\n```\n\n### Example: redirecting requests\n\nSometimes you need to redirect old domains to new ones. You can do that with the `redirects` rule. Here's an example redirect rule:\n\n[See full `redirects` reference](#redirects)\n\n```yaml\nredirects:\n  - from: my-old-site.com\n    to: https://my-site.com\n```\n\n### Example: using a metrics dashboard\n\n`homebase` has built-in support for [Prometheus](https://prometheus.io), which can be visualized with [Grafana](http://grafana.org/).\n\n![./grafana-screenshot.png](./grafana-screenshot.png)\n\nHomebase exposes its metrics at port 8089. Prometheus periodically scrapes the metrics and stores them in a database. Grafana uses those metrics and provides a provides a nice dashboard visualization. It's a little daunting at first, but setup should be relatively painless.\n\nSteps:\n\n 1. [Install Prometheus](https://prometheus.io/download/) on your server\n 2. [Install Grafana](http://grafana.org/download/) on your server\n 3. Update the `prometheus.yml` config\n 4. Start Prometheus and Grafana\n 5. Login to Grafana\n 6. Add Prometheus as a data source to Grafana (it should be running at `localhost:9090`\n 7. Import [this Grafana dashboard](./grafana-dashboard.json)\n\nYour `prometheus.yml` config should include have the `scrape_configs` option set like this:\n\n```yaml\nscrape_configs:\n  - job_name: 'prometheus'\n    static_configs:\n      - targets: ['localhost:9090']\n  - job_name: 'homebase'\n    static_configs:\n      - targets: ['localhost:8089']\n```\n\n### Example: running homebase behind Apache or Nginx\n\nIf you're running `homebase` on a server that uses Apache or Nginx, you may need to change your config to disable HTTPS. For instance, if you're using nginx and proxying to port `8080`, update your config to set the HTTP port:\n\n```yaml\nports:\n  http: 8080\n```\n\nYou will need to add all domains to your Nginx/Apache config.\n\n### Example: running homebase in a docker container\n\n1. Install [Docker](http://docker.com/). If you're on Linux, remember to [configure Docker to start on boot](https://docs.docker.com/install/linux/linux-postinstall/). Don't know of the equivalent for other systems.\n\n2. Clone the project. Edit `.homebase.yml` according to your needs. Most importantly: **Change username and password**.  \nIf you don't want to think of a username and a password, just use [this](https://stackoverflow.com/a/1349426/6690391) but **increase the length**.\n\n3. In the project root, run this command:\n\n```\ndocker build -t homebase:latest . \u0026\u0026 docker run -d --name=homebase --restart=always -p 80:80 -p 443:443 -p 3282:3282 homebase:latest\n```\n\n**Notes:**  \n1. Not an expert in Docker security or configuration.  \n2. if you have Beaker on the same machine, you may want to change the hyperdrive port `-p 3282:3282` to something like `-p 9999:3282`.  \n3. To debug the running container:\n   - Run `docker ps -a` to see the container running status.  \n   - Run `docker logs homebase` to see the logs.\n   - Run `docker exec -it homebase sh` to get into a terminal.\n4. Didn't think about how you'd install a newer version of homebase while keeping the old configuration and data.\n\n## Troubleshooting\n\n### Installing build dependencies\n\nWhen installing `homebase`, you may need to install additional build dependencies:\n\n```\nsudo apt-get install libtool m4 automake libcap2-bin build-essential\n```\n\n### Port setup (EACCES error)\n\nFor `homebase` to work correctly, you need to be able to access port 80 (http), 443 (https), and 3282 (hyperdrive). Your firewall should be configured to allow traffic on those ports.\n\nIf you get an EACCES error on startup, you either have a process using the port already, or you lack permission to use the port. Try `lsof -i tcp:80` or `lsof -i tcp:443` to see if there are any processes bound to the ports you need.\n\nIf the ports are not in use, then it's probably a permissions problem. We recommend using the following command to solve that:\n\n```\n# give node perms to use ports 80 and 443\nsudo setcap cap_net_bind_service=+ep `readlink -f \\`which node\\``\n```\n\nThis will give nodejs the rights to use ports 80 and 443. This is preferable to running homebase as root, because that carries some risk of a bug in `homebase` allowing somebody to control your server.\n\n## Support\n\n`homebase` is built by the [Beaker Browser team](https://beakerbrowser.com/about). Become a backer and help support the development of an open, friendly, and fun Web. You can help us continue our work on Beaker, [hashbase.io](https://hashbase.io), `homebase`, and more. Thank you!\n\n[Become a backer](https://opencollective.com/beaker)\n\n\u003ca href=\"https://opencollective.com/beaker/backer/0/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/0/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/1/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/1/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/2/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/2/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/3/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/3/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/4/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/4/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/5/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/5/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/6/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/6/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/7/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/7/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/8/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/8/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/9/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/9/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/10/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/10/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/11/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/11/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/12/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/12/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/13/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/13/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/14/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/14/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/15/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/15/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/16/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/16/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/17/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/17/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/18/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/18/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/19/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/19/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/20/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/20/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/21/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/21/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/22/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/22/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/23/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/23/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/24/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/24/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/25/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/25/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/26/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/26/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/27/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/27/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/28/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/28/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/29/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/29/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/30/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/30/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/31/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/31/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/32/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/32/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/33/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/33/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/34/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/34/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/35/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/35/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/36/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/36/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/37/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/37/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/38/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/38/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/39/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/39/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/40/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/40/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/41/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/41/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/42/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/42/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/43/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/43/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/44/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/44/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/45/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/45/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/46/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/46/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/47/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/47/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/48/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/48/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/49/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/49/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/50/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/50/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/51/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/51/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/52/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/52/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/53/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/53/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/54/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/54/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/55/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/55/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/56/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/56/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/57/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/57/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/58/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/58/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/59/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/59/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/60/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/60/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/61/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/61/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/62/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/62/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/63/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/63/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/64/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/64/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/65/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/65/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/66/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/66/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/67/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/67/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/68/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/68/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/69/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/69/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/70/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/70/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/71/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/71/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/72/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/72/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/73/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/73/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/74/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/74/avatar.svg\"/\u003e\u003c/a\u003e  \u003ca href=\"https://opencollective.com/beaker/backer/75/website\" target=\"_blank\"\u003e\u003cimg src=\"https://opencollective.com/beaker/backer/75/avatar.svg\"/\u003e\u003c/a\u003e\n\n\n## Changelog\n\n### v3.0.0\n\n - Added Hyperdrive support.\n - Deprecated Dat support. If you still need dat support, you'll need to use Homebase v2.\n - Deprecated the Web API.\n - Deprecated Lets Encrypt due to Greenlock changing too much to keep up with.\n\n### v2.0.0\n\n - Removed the `dats.*.name` field. You can now set the domains for your dats directly with the `dat.*.domains` field.\n - Moved the `domain` config from the top of the yaml file to the `webapi` field. This makes it clearer what the domain applies to. Optional, unless you want to use Let's Encrypt.\n\nThe original release of `homebase` tried to mimic [Hashbase](https://github.com/beakerbrowser/hashbase) as closely as possible. As a result, it had a concept of a root domain and each dat was given a `name` which became a subdomain under that root domain. This confused most users and was generally regarded as \"the worst.\" To simplify the config process, we removed the concept of the root domain and `name` attribute. Now, you just set the domains directly on each dat.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeakerbrowser%2Fhomebase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeakerbrowser%2Fhomebase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeakerbrowser%2Fhomebase/lists"}