{"id":23377864,"url":"https://github.com/tanq16/local-content-share","last_synced_at":"2026-01-28T23:00:38.112Z","repository":{"id":160510195,"uuid":"631457926","full_name":"Tanq16/local-content-share","owner":"Tanq16","description":"Self-hosted app with browser frontend that enables sharing and storing text snippets and files. Also includes a markdown and rich text scratchpad.","archived":false,"fork":false,"pushed_at":"2025-11-30T02:48:01.000Z","size":16056,"stargazers_count":380,"open_issues_count":6,"forks_count":7,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-12-02T07:38:00.182Z","etag":null,"topics":["airdrop","data-sharing","docker","file-sharing","file-upload","go","golang","homelab","local-first","notepad","pastebin","pastebin-service","scratchpad","self-hosted","self-hosting","snippets-manager","text-sharing","text-upload","webapp"],"latest_commit_sha":null,"homepage":"","language":"HTML","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/Tanq16.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":null,"dco":null,"cla":null}},"created_at":"2023-04-23T04:42:04.000Z","updated_at":"2025-12-01T11:59:56.000Z","dependencies_parsed_at":null,"dependency_job_id":"b4d1373c-7edf-4efc-8bb6-7afd2afabdb7","html_url":"https://github.com/Tanq16/local-content-share","commit_stats":null,"previous_names":[],"tags_count":37,"template":false,"template_full_name":null,"purl":"pkg:github/Tanq16/local-content-share","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flocal-content-share","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flocal-content-share/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flocal-content-share/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flocal-content-share/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tanq16","download_url":"https://codeload.github.com/Tanq16/local-content-share/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Flocal-content-share/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28854401,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-28T22:56:21.783Z","status":"ssl_error","status_checked_at":"2026-01-28T22:56:00.861Z","response_time":57,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["airdrop","data-sharing","docker","file-sharing","file-upload","go","golang","homelab","local-first","notepad","pastebin","pastebin-service","scratchpad","self-hosted","self-hosting","snippets-manager","text-sharing","text-upload","webapp"],"created_at":"2024-12-21T18:20:29.060Z","updated_at":"2026-01-28T23:00:38.106Z","avatar_url":"https://github.com/Tanq16.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.svg\" alt=\"Local Content Share Logo\" width=\"200\"\u003e\n  \u003ch1\u003eLocal Content Share\u003c/h1\u003e\n\n  \u003ca href=\"https://github.com/tanq16/local-content-share/actions/workflows/binary-build.yml\"\u003e\u003cimg alt=\"Build Workflow\" src=\"https://github.com/tanq16/local-content-share/actions/workflows/binary-build.yml/badge.svg\"\u003e\u003c/a\u003e\u0026nbsp;\u003ca href=\"https://github.com/tanq16/local-content-share/actions/workflows/docker-publish.yml\"\u003e\u003cimg alt=\"Container Workflow\" src=\"https://github.com/tanq16/local-content-share/actions/workflows/docker-publish.yml/badge.svg\"\u003e\u003c/a\u003e\u003cbr\u003e\n  \u003ca href=\"https://github.com/Tanq16/local-content-share/releases\"\u003e\u003cimg alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/tanq16/local-content-share\"\u003e\u003c/a\u003e\u0026nbsp;\u003ca href=\"https://hub.docker.com/r/tanq16/local-content-share\"\u003e\u003cimg alt=\"Docker Pulls\" src=\"https://img.shields.io/docker/pulls/tanq16/local-content-share\"\u003e\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e\n  \u003ca href=\"#screenshots\"\u003eScreenshots\u003c/a\u003e \u0026bull; \u003ca href=\"#installation-and-usage\"\u003eInstall \u0026 Use\u003c/a\u003e \u0026bull; \u003ca href=\"#tips-and-notes\"\u003eTips \u0026 Notes\u003c/a\u003e\n\u003c/div\u003e\n\n---\n\nA simple \u0026 elegant self-hosted app for **storing/sharing text snippets, files, and links** in your **local network** with **no setup on client devices**. Think of this as an *all-in-one alternative* to **airdrop**, **local-pastebin**, and a **scratchpad**. The primary features are:\n\n- Make plain text **snippets** available to **view/share** on any device in the local network\n- **Upload files** and make them available to **view/download** on any device in the local network\n- **Store links** to **share** in last in, first show order in its own section\n- Built-in **Notepad** with **Markdown** editing and preview capabilities\n- **Rename** text snippets and files uploaded to easily find them in the UI\n- **Edit** text snippets to modify their content as needed\n- **Multi-file** **drag-n-drop** support for uploading files\n- Configurable **expiration (or TTL, i.e., time to live)** per file/snippet for Never, 1 hour, 4 hours, 1 day, or Custom\n- Use of **SSE** to automatically inform all clients of new/deleted/edited files\n- Completely **local assets**, so the app works in your network even without internet\n- **Multi-arch** (x86-64 and ARM64) **Docker image** for **homelab** deployments\n- Frontend accessible via **browsers** and as a **PWA** (progressive web apps)\n- Clean, modern interface with **automatic light/dark** Catppuccin themed UI that looks good on mobile too\n\nMake sure to look into [Tips \u0026 Notes](#tips-and-notes) if you have questions about individual functionalities.\n\n\u003e [!NOTE]\n\u003e This application is meant to be deployed within your homelab only. There is no authentication mechanism implemented. If you are exposing to the public, ensure there is authentication fronting it and non-destructive users using it.\n\n## Screenshots\n\n| | Desktop View | Mobile View |\n| --- | --- | --- |\n| Light | \u003cimg src=\"assets/dlight.png\" alt=\"Light\"\u003e | \u003cimg src=\"assets/mlight.png\" alt=\"Light\"\u003e |\n| Dark | \u003cimg src=\"assets/ddark.png\" alt=\"Dark\"\u003e | \u003cimg src=\"assets/mdark.png\" alt=\"Dark\"\u003e |\n\n## Installation and Usage\n\n### Using Docker (Recommended for Self-Hosting)\n\nUse `docker` CLI one liner and setup a persistence directory (so a container failure does not delete your data):\n\n```bash\nmkdir $HOME/.localcontentshare\n```\n```bash\ndocker run --name local-content-share \\\n  -p 8080:8080 \\\n  -v $HOME/.localcontentshare:/app/data \\\n  tanq16/local-content-share:main\n```\n\nThe application will be available at `http://localhost:8080` (or your server IP).\n\nYou can also use the following compose file with container managers like Portainer and Dockge (remember to change the mounted volume):\n\n```yaml\nservices:\n  contentshare:\n    image: tanq16/local-content-share:main\n    container_name: local-content-share\n    volumes:\n      - /home/tanq/lcshare:/app/data # Change as needed\n    ports:\n      - 8080:8080\n```\n\n### Using Binary\n\nDownload the appropriate binary for your system from the [latest release](https://github.com/tanq16/local-content-share/releases/latest).\n\nMake the binary executable (for Linux/macOS) with `chmod +x local-content-share-*` and then run the binary with `./local-content-share-*`. The application will be available at `http://localhost:8080`.\n\n### Local development\n\nWith `Go 1.23+` installed, run the following to download the binary to your GOBIN:\n\n```bash\ngo install github.com/tanq16/local-content-share@latest\n```\n\nOr, you can build from source like so:\n\n```bash\ngit clone https://github.com/tanq16/local-content-share.git \u0026\u0026 \\\ncd local-content-share \u0026\u0026 \\\ngo build .\n```\n\n## Tips and Notes\n\n- To share text content:\n   - Type or paste your text in the text area (the upload button will change to a submit button)\n   - (OPTIONAL) type the name of the snippet (otherwise it will name it as a time string)\n   - Click the submit button (looks like the telegram arrow) to upload the snippet\n- To rename files or text snippets:\n   - Click the cursor (i-beam) icon and provide the new name\n   - It will automatically prepend 4 random digits if the name isn't unique\n- To edit existing snippets:\n   - Click the pen icon and it will populate the expandable text area with the content\n   - Write the new content and click accept or deny (check or cross) in the same text area\n   - On accepting, it will edit the content; on denying, it will refresh the page\n- To share files:\n   - Click the upload button and select your file\n   - OR drag and drop your file (even multiple files) to the text area\n   - OR click into the text area and paste a file or screenshot from clipboard\n   - It will automatically append 4 random digits if filename isn't unique\n- To view content, click the eye icon:\n   - For text content, it shows the raw text, which can be copied with a button on top\n   - For files, it shows raw text, images, PDFs, etc. (basically whatever the browser will do)\n- To download files, click the download icon\n- To delete content, click the trash icon\n- To set expiration for a file or snippet\n   - Click the clock icon with the \"Never\" text (signifying no expiry) to cycle between times\n   - For a non-\"Never\" expiration, the file will automatically be removed after the specified period\n   - Set the cycling button to 1 hour, 4 hours, 1 day, or Custom before adding a snippet or file\n      - The Custom option will prompt to ask for the expiry after you click submit/upload\n      - The value for custom expiration can be of the format `NT` (eg. `34m`, `3w`, `2M`, `11d`)\n      - N is the number and T is the time denomination (m=minute, h=hour, d=day, w=week, M=month, y=year)\n   - Use the `DEFAULT_EXPIRY` environment variable to set a default expiration (follows format of Custom specified above)\n      - This value will be set as default on the home page instead of `Never`\n      - The other options will still be available by cycling if needed\n- The Notepad is for writing something quickly and getting back to it from any device\n   - It supports both markdown edit and preview modes\n   - Content is automatically saved upon inactivity in the backend and will load as is on any device\n\n### A Note on Reverse Proxies\n\nReverse proxies are fairly common in homelab settings to assign SSL certificates and use domains. The reason for this note is that some reverse proxy settings may interfere with the functioning of this app. Primarily, there are 2 features that could be affected:\n\n- File Size: reverse proxy software may impose a limit on file sizes, but Local Content Share does not\n- Upload Progress: file upload progress for large files may not be visible until the file has been uploaded because of buffering setups on rever proxy software\n\nFollowing is a sample fix for Nginx Proxy Manager, please look into equivalent settings for other reverse proxy setups like Caddy.\n\nFor the associated proxy host in NPM, click Edit and visit the Advanced tab. There, paste the following custom configuration:\n\n```\nclient_max_body_size 5G;\nproxy_request_buffering off;\nproxy_buffering off;\nproxy_read_timeout 3600s;\nproxy_send_timeout 3600s;\nproxy_connect_timeout 3600s;\n```\n\nThis configuration will set the maximum accept size for file transfer through NPM as 5 GB and will also disable buffering so interaction will take place directly with Local Content Share.\n\n### Backend Data Structure\n\nThe application creates a `data` directory to store all uploaded files, text snippets, notepad notes, and links (in `files/`, `text/`, `md.file`, and `links.file` respectively). File expirations are saved in an `expiration.json` file in the data directory. Make sure the application has write permissions for the directory where it runs.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Flocal-content-share","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanq16%2Flocal-content-share","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Flocal-content-share/lists"}