{"id":16975527,"url":"https://github.com/shu8/linkener-web","last_synced_at":"2026-02-14T22:30:59.836Z","repository":{"id":83199336,"uuid":"296107725","full_name":"shu8/linkener-web","owner":"shu8","description":"An easy to use, minimalistic admin panel wrapped into a web-app for the Linkener URL shortener, written using Svelte/Sapper","archived":false,"fork":false,"pushed_at":"2022-12-14T22:33:15.000Z","size":1178,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-20T16:43:49.997Z","etag":null,"topics":["docker-image","sapper-app","self-hosted","url-shortener"],"latest_commit_sha":null,"homepage":"","language":"Svelte","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/shu8.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}},"created_at":"2020-09-16T17:53:48.000Z","updated_at":"2024-12-30T00:32:02.000Z","dependencies_parsed_at":"2023-05-05T10:16:54.540Z","dependency_job_id":null,"html_url":"https://github.com/shu8/linkener-web","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/shu8/linkener-web","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shu8%2Flinkener-web","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shu8%2Flinkener-web/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shu8%2Flinkener-web/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shu8%2Flinkener-web/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shu8","download_url":"https://codeload.github.com/shu8/linkener-web/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shu8%2Flinkener-web/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29458553,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-14T21:29:27.764Z","status":"ssl_error","status_checked_at":"2026-02-14T21:28:11.111Z","response_time":53,"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":["docker-image","sapper-app","self-hosted","url-shortener"],"created_at":"2024-10-14T01:23:02.809Z","updated_at":"2026-02-14T22:30:59.822Z","avatar_url":"https://github.com/shu8.png","language":"Svelte","funding_links":["https://img.shields.io/static/v1?label=Sponsor\u0026message=%E2%9D%A4\u0026logo=GitHub\u0026link=https://github.com/sponsors/shu8/","https://github.com/sponsors/shu8/"],"categories":[],"sub_categories":[],"readme":"# Linkener Web Client\n\n![GitHub release (latest by date)](https://img.shields.io/github/v/release/shu8/linkener-web) ![MIT License](https://img.shields.io/github/license/shu8/linkener-web) [![Sponsor me on GitHub](https://img.shields.io/static/v1?label=Sponsor\u0026message=%E2%9D%A4\u0026logo=GitHub\u0026link=https://github.com/sponsors/shu8/)](https://github.com/sponsors/shu8/)\n\n\u003cp align='center'\u003e\n    \u003cimg src='./static/logo.png' alt='Linkener' width=\"20%\" /\u003e\n\u003c/p\u003e\n\nAn easy to use, minimalistic admin panel wrapped into a web-app for the [_Linkener_ URL shortener (GitHub repo)](https://github.com/shu8/linkener), written using [Svelte](https://svelte.dev/)/[Sapper](https://sapper.svelte.dev/).\n\nIt's a Progressive Web App, so can be 'installed' on any mobile device for easy access from anywhere.\n\n## ⭐ Features\n\n- 🔑 User login/registration support\n- ⚙ Customizable API endpoint option (connect to any Linkener instance)\n- 🌐 Browse through all your Short URLs\n- ✏ Edit Short URLs (password, maximum visit count, destinations)\n- 📈 View stats for your Short URLs (currently only the HTTP referers and visit count are stored)\n- ✒ Create Short URLs (custom slugs, automatic slugs, passwords, maximum visit counts)\n\nIt uses [Sapper](https://sapper.svelte.dev/) to be lightweight, fast, and easily customizable.\n\n## 👀 Demo\n\n\u003cp align='center'\u003e\n    \u003cimg src='./promo/demo.gif' alt='Linkener Web Client Demo' width=\"70%\" /\u003e\n\u003c/p\u003e\n\n## 📥 Installation\n\n### Docker image\n\nFor many cases, using the Docker image (~20MB based on Alpine Linux/Nginx) will be the easiest and fastest way to setup the Linkener Web Client.\n\n```bash\ndocker run -p 5000:80 shu8/linkener-web:0.1.0\n```\n\nThis will start a container running the Linkener Web Client on port 5000 (you can change this as desired).\n\n### Docker compose\n\nIf you want to build a container yourself, you can use the included [Docker Compose file](./docker-compose.yml) to spin one up!\n\n**Note:** a common scenario where you might need to use this docker compose method is if you want to serve the web-app on a _subpath_ (e.g. `doma.in/admin` compared to at `doma.in/`). The Docker Compose file has a `BASE_PATH` build arg for this case, to be used like `--build-arg BASE_PATH=/YOUR_BASE_PATH`. It will handle all the changes required to make the web-app work on your subpath!\n\n```bash\ngit clone git@github.com:shu8/linkener-web.git\n# Or git clone https://github.com/shu8/linkener-web.git if using HTTPS\n# Make your changes to the docker-compose.yml file or the main code and then:\ndocker-compose up -d [--build-arg BASE_PATH=/admin]\n```\n\n### Building manually\n\nIt's also really easy to build the project manually!\n\n**Note:** similar to what was mentioned in the Docker Compose section above, if you want to serve the web-app on a subpath, you'll need to export the site a bit differently -- you'll need a `BASE_ENV` environment variable and will need to tweak the `export` command:\n\n```bash\ngit clone git@github.com:shu8/linkener-web.git\n# Or git clone https://github.com/shu8/linkener-web.git if using HTTPS\nnpm install\n\n# Simple version, when serving on website root:\nnpm run export\n\n# Advanced version, when serving on a subpath:\nBASE_ENV=/admin npm run export --basepath /admin\n```\n\nThis will produce a static site in the `__sapper__/export` directory, which you can use to serve using something like [Nginx](https://www.nginx.com/) or [Caddy](https://caddyserver.com/).\n\n## 🌐 Hosting\n\nYou can choose whether to host this web client on the same server/machine as your main Linkener instance.\n\nIf you choose to host it on the same server, you can use something like [Nginx](https://www.nginx.com) to serve both the main Linkener server (see the [`linkener`](https://github.com/shu8/linkener) repo) and this interface on a **subpath**. Your config might look like (**note:** if serving the web-app on a subpath, make sure you've built the container/static site using the relevant instructions above):\n\n```\nserver {\n        listen 80;\n        listen [::]:80;\n\n        server_name doma.in www.doma.in;\n\n        location /admin {\n            # You might also need:\n            # add_header Service-Worker-Allowed /;\n\n            # Linkener web client (local static directory)\n            root /path/to/linkener-web/static/dir;\n            try_files $uri $uri/ /index.html;\n\n            # Or Linkener web client (docker)\n            proxy_pass http://127.0.0.1:5001/admin/;\n            proxy_intercept_errors on;\n            error_page 404 = /admin/index.html;\n        }\n\n        location / {\n            # Main Linkener process\n            proxy_pass http://127.0.0.1:3000;\n        }\n}\n```\n\nor, if you want to use a **subdomain**:\n\n```\nserver {\n        listen 80;\n        listen [::]:80;\n\n        server_name doma.in www.doma.in;\n\n        location / {\n            proxy_pass http://127.0.0.1:3000;\n        }\n}\n\nserver {\n        listen 80;\n        listen [::]:80;\n\n        server_name admin.doma.in www.admin.doma.in;\n\n        root /path/to/linkener-web/static/dir;\n\n        location / {\n            # Using local static directory\n            try_files $uri $uri/ /index.html;\n\n            # Or using docker\n            proxy_pass http://127.0.0.1:5000;\n        }\n}\n```\n\n## ▶ Usage\n\nOnce the web-app is running, navigating to the site will show you the login page. You can follow the link to the register page (at `/register`) to create an account on any Linkener instance which has `registration_enabled=true`. You'll need to provide the API URL for the relevant Linkener instance (e.g. `https://doma.in/api/`) -- **note the trailing slash!**):\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./promo/login.png\" width=\"46.5%\" /\u003e\n    \u003cimg src=\"./promo/new-link.png\" width=\"45%\" /\u003e\n\u003c/p\u003e\n\nSee the GIF at the top of this README for a demo of all the pages!\n\n## ❓ Why?\n\nThis Web Client is to be used with [Linkener](https://github.com/shu8/linkener), to provide a really easy and accessible way to manage your Short URLs.\n\nYou're entirely free to make your own client, or use cURL, or Postman, or anything else -- but using this Web Client might be easier in the first instance!\n\nIt's written using Svelte/Sapper simply because I wanted to learn more about the frameworks, and wanted to make the web-app fast and static.\n\n## 👩🏾‍💻 Contributing\n\nI'd love contributions! If you're interested in contributing to Linkener, please fork the repo, add your commits, and [open a pull request](https://github.com/shu8/linkener-web/compare/) for reviewing!\n\nFeel free to open an issue first if you want to validate or get suggestions on an idea!\n\n## ℹ Support\n\nPlease [open an issue](https://github.com/shu8/linkener-web/issues/new) for support -- from anywhere like reporting bugs, suggesting new features, or help getting Linkener up and running on your setup! :)\n\n## 🔑 License\n\n\u0026copy; [Shubham Jain](https://sjain.dev) 2020, [MIT License](./LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshu8%2Flinkener-web","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshu8%2Flinkener-web","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshu8%2Flinkener-web/lists"}