{"id":13588494,"url":"https://github.com/tycrek/ass","last_synced_at":"2025-08-18T02:31:34.311Z","repository":{"id":38962737,"uuid":"354968026","full_name":"tycrek/ass","owner":"tycrek","description":"The simple self-hosted ShareX server","archived":true,"fork":false,"pushed_at":"2025-02-23T23:12:53.000Z","size":2741,"stargazers_count":679,"open_issues_count":31,"forks_count":53,"subscribers_count":9,"default_branch":"dev/0.15.0","last_synced_at":"2025-08-16T00:59:47.831Z","etag":null,"topics":["discord","embeds","self-hosted","sharex","sharex-server","sharex-uploader"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"isc","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tycrek.png","metadata":{"files":{"readme":".github/README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"ko_fi":"tycrek"}},"created_at":"2021-04-05T20:46:02.000Z","updated_at":"2025-08-12T10:23:25.000Z","dependencies_parsed_at":"2023-10-16T14:49:04.768Z","dependency_job_id":"a32b32f9-23ce-4cf2-ab8d-f6241e76e3a8","html_url":"https://github.com/tycrek/ass","commit_stats":null,"previous_names":[],"tags_count":42,"template":false,"template_full_name":null,"purl":"pkg:github/tycrek/ass","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tycrek%2Fass","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tycrek%2Fass/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tycrek%2Fass/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tycrek%2Fass/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tycrek","download_url":"https://codeload.github.com/tycrek/ass/tar.gz/refs/heads/dev/0.15.0","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tycrek%2Fass/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270933599,"owners_count":24670443,"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","status":"online","status_checked_at":"2025-08-18T02:00:08.743Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["discord","embeds","self-hosted","sharex","sharex-server","sharex-uploader"],"created_at":"2024-08-01T15:06:44.869Z","updated_at":"2025-08-18T02:31:34.293Z","avatar_url":"https://github.com/tycrek.png","language":"TypeScript","funding_links":["https://ko-fi.com/tycrek"],"categories":["TypeScript","Software","Others"],"sub_categories":["File Transfer - Single-click \u0026 Drag-n-drop Upload"],"readme":"# This project is no longer maintained. see [yaass] instead.\n\nass will no longer receive any updates. Please consider using [yaass] instead. Join the yaass [Discord server][Discord invite] for information and support.\n\n[yaass]: https://github.com/tycrek/yaass\n\n\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\u003cbr\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ch1\u003e\u003ca href=\"https://github.com/tycrek/ass\" target=\"_blank\"\u003e\u003cimg height=\"180\" alt=\"ass\" src=\"https://i.tycrek.dev/ass-round-square-logo-white-with-text\"\u003e\u003c/a\u003e\u003c/h1\u003e\n\n![GitHub package.json version]\n![GitHub license]\n![GitHub last commit]\n![GitHub Repo stars]\n[![Discord badge]][Discord invite]\n\n\u003c/div\u003e\n\n**ass** is a self-hosted ShareX upload server written in TypeScript.\n\n[GitHub package.json version]: https://img.shields.io/github/package-json/v/tycrek/ass?color=fd842d\u0026style=for-the-badge\n[GitHub license]: https://img.shields.io/github/license/tycrek/ass?color=FD7C21\u0026style=for-the-badge\n[GitHub last commit]: https://img.shields.io/github/last-commit/tycrek/ass?color=FD710D\u0026style=for-the-badge\n[GitHub Repo stars]: https://img.shields.io/github/stars/tycrek/ass?color=F26602\u0026style=for-the-badge\n[Discord badge]: https://img.shields.io/discord/848274994375294986?label=Discord\u0026logo=Discord\u0026logoColor=FFF\u0026style=for-the-badge\n[Discord invite]: https://discord.gg/wGZYt5fasY\n\n## Features\n\n###### Out of date\n\n#### For users\n\n- Upload images, gifs, videos, audio, \u0026 files\n- Token-based authentication\n- Download \u0026 delete resources\n- GPS data automatically removed\n- Fully customizable Discord embeds\n- Built-in web viewer with video \u0026 audio player\n- Dashboard to manage your files\n- Embed images, gifs, \u0026 videos directly in Discord\n- Personal upload log using customizable Discord Webhooks\n- macOS/Linux support with alternative clients such as [Flameshot] ([script for ass]) \u0026 [MagicCap]\n- **Multiple URL styles**\n   - Mixed-case alphanumeric\n   - Gfycat\n   - Timestamp\n   - Original\n   - ZWS\n\n#### For hosts \u0026 developers\n\n- Multi-user support\n- Run locally or via Docker\n- API for developers to write custom interfaces\n- **Multiple file storage methods**\n   - Local file system\n   - S3\n- **Multiple data storage methods**\n   - JSON\n   - MySQL\n   - PostgreSQL\n\n[Flameshot]: https://flameshot.org/\n[script for ass]: #flameshot-users-linux\n[MagicCap]: https://magiccap.me/\n\n### Access types\n\n| Type | What is it? |\n| ---- | ----------- |\n| **Mixed-case alphanumeric** | The \"safe\" mode. URL's are browser safe as the character set is just letters \u0026 numbers. |\n| **Gfycat** | Gfycat-style ID's (for example: `https://example.com/unsung-discrete-grub`). Thanks to [Gfycat] for the wordlists |\n| **Timestamp** | The quick but dirty mode. URL is a timestamp of when the file was uploaded, in milliseconds. This is the most unique mode, but also potentially the longest (Gfycat could be longer, easily). **Keep in mind this is vulnerable to iteration attacks** |\n| **Original** | The \"basic\" mode. URL matches the same filename as when the file was uploaded. This may be prone to conflicts with files of the same name. |\n| **ZWS** | \"Zero-width spaces\": when pasted elsewhere, the URL appears to be *just* your domain name. Some browsers or sites may not recognize these URLs (Discord sadly no longer supports these as of April 2023) |\n\n[Gfycat]: https://gfycat.com\n\n## Installation\n\nass supports two installation methods: Docker \u0026 local.\n\n### Docker\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cem\u003eExpand for Docker/Docker Compose installation steps\u003c/em\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\n[Docker Compose] is the recommended way to install ass. These steps assume you already Docker \u0026 Docker Compose v2 installed.\n\n[Docker Compose]: https://docs.docker.com/compose/\n\n#### Install using docker-compose\n\n0. This repo comes with a pre-made Compose file.\n1. Clone the repo using `git clone https://github.com/tycrek/ass.git \u0026\u0026 cd ass/`\n2. Run `docker compose up`\n   - You can append `-d` to run in the background.\n3. When the logs indicate, visit your installation in your browser to begin the setup.\n\n\u003c/details\u003e\n\n### Local\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cem\u003eExpand for local installation steps\u003c/em\u003e\u003c/summary\u003e\n\u003cbr\u003e\n\n1. You should have **Node.js 20** \u0026 **npm 10 or later** installed. \n2. Clone this repo using `git clone https://github.com/tycrek/ass.git \u0026\u0026 cd ass/`\n3. Run `pnpm i` or `npm i`\n4. Run `npm run build`\n5. Run `npm start`\n6. When the logs indicate, visit your installation in your browser to begin the setup.\n\n\u003c/details\u003e\n\n# the readme from this point is out of date\n\n## Using HTTPS\n\nFor HTTPS support, you must configure a reverse proxy. I recommend [Caddy] but any reverse proxy works fine (such as Apache or Nginx). A sample config for Caddy is provided below:\n\n```\nass.example.com {\n    reverse_proxy localhost:40115\n}\n```\n\n[Caddy]: https://caddyserver.com/\n\n## Cloudflare users\n\nIn your Cloudflare DNS dashboard, set your domain/subdomain to **DNS Only** if you experience issues with **Proxied**. This may not be necessary for all users.\n\n\u003e \u003cimg src=\"https://user-images.githubusercontent.com/29926144/114085791-0f467680-986f-11eb-8cdb-34a9dfae3a23.png\" height=\"140px\"\u003e\n\n## Configure ShareX\n\n1. Add a new Custom Uploader in ShareX by going to `Destinations \u003e Custom uploader settings...`\n2. Under **Uploaders**, click **New** \u0026 name it whatever you like.\n3. Set **Destination type** to `Image`, `Text`, \u0026 `File`\n4. **Request** tab:\n   - Method: `POST`\n   - URL: `https://your.domain.name.here/`\n   - Body: `Form data (multipart/form-data)`\n   - File from name: `file` (literally put \"`file`\" in the field)\n   - Headers:\n      - Name: `Authorization`\n\t  - Value: (the value provided by `npm start` on first run)\n5. **Response** tab:\n   - URL: `{json:.resource}`\n   - Thumbnail: `{json:.thumbnail}`\n   - Deletion URL: `{json:.delete}`\n   - Error message: `{response}`\n   - MagicCap users: **do not** include the `.` in the above \u0026 replace `{}` with `$` (i.e. `$json:resource$`)\n6. The file `sample_config.sxcu` can also be modified \u0026 imported to suit your needs\n\n### Header overrides\n\nIf you need to override a specific part of the config to be different from the global config, you may do so via \"`X`\" HTTP headers:\n\n| Header | Purpose |\n| ------ | ------- |\n| **`X-Ass-Domain`** | Override the domain returned for the clipboard (useful for multi-domain hosts) |\n| **`X-Ass-Access`** | Override the generator used for the resource URL. Must be one of: `original`, `zws`, `gfycat`, `random`, or `timestamp` ([see above](#access-types)) |\n| **`X-Ass-Gfycat`** | Override the length of Gfycat ID's. Defaults to `2` |\n| **`X-Ass-Timeoffset`** | Override the timestamp offset. Defaults to `UTC+0`. Available options are whatever [Luxon] accepts (for example: `America/Edmonton` or `UTC-7`) |\n\n[Luxon]: https://moment.github.io/luxon/#/zones?id=specifying-a-zone\n\n### Webhooks\n\nYou may use Discord webhooks as an easy way to keep track of your uploads. The first step is to [create a new Webhook]. You only need to follow the first section, **Making a Webhook**. Once you are done that, click **Copy Webhook URL**. Finally, add these headers to your custom uploader:\n\n| Header | Purpose |\n| ------ | ------- |\n| **`X-Ass-Webhook-Url`** | The **Webhook URL** you copied |\n| **`X-Ass-Webhook-Username`** | (Optional) the \"username\" of the Webhook; can be set to whatever you want |\n| **`X-Ass-Webhook-Avatar`** | (Optional) URL to an image to use as the Webhook avatar. Use the **full** URL including `https://` |\n\nWebhooks will show the filename, mimetype, size, upload timestamp, thumbail, \u0026 a link to delete the file. To disable webhooks, simply remove the headers from your config.\n\n[create a new Webhook]: https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks\n\n## Custom index\n\nBy default, ass directs the index route `/` to this README. Follow these steps to use a custom index:\n\n1. Create a file in the `share/` directory called `index.html` or `index.js`.\n   - ass will treat `index.html` as an HTML file and will send it to the client.\n   - ass will treat `index.js` as a Node.js file that exports a function representing [Express middleware](https://expressjs.com/en/guide/using-middleware.html). ass will pass all handling of the index to this function. The function should take three arguments: `(req, res, next)`. Some code samples for common use cases are provided below.\n   - If both `index.html` and `index.js` are present, the `index.html` file will be served first.\n2. Add whatever you want to the file.\n3. Restart ass. The startup info logs should mention which file is being used as the index.\n\n### Custom index code samples\n\n**Redirect to a custom frontend registration page**\n\n```js\nmodule.exports = (req, res, next) =\u003e res.redirect('/register');\n```\n\n## Custom 404 page\n\nTo use a custom 404 page, create a file in the `share/` directory called `404.html`. Restart ass, and any requests to missing resources will return HTTP 404 with the contents of this file.\n\nIf there's interest, I may allow making this a function, similar to the custom index.\n\n## Flameshot users (Linux)\n\nUse [`flameshot-v2.sh`] or [`sample_screenshotter.sh`].\n\n[`flameshot-v2.sh`]: https://github.com/tycrek/ass/blob/dev/0.15.0/flameshot-v2.sh\n[`sample_screenshotter.sh`]: https://github.com/tycrek/ass/blob/dev/0.15.0/sample_screenshotter.sh\n\n## Contributing\n\nPlease follow the [Contributing Guidelines] when submiting Issues or Pull Requests.\n\n[Contributing Guidelines]: https://github.com/tycrek/ass/blob/master/.github/CONTRIBUTING.md\n\n## Credits\n\n- Thanks to [hlsl#1359] for the logo\n- [Gfycat] for their wordlists\n- [Aven], for helping kickstart the project\n\n[hlsl#1359]: https://behance.net/zevwolf\n[Aven]: https://github.com/ToxicAven\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftycrek%2Fass","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftycrek%2Fass","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftycrek%2Fass/lists"}