{"id":50969408,"url":"https://github.com/aelithron/universal-status","last_synced_at":"2026-06-19T00:30:51.277Z","repository":{"id":306879644,"uuid":"1027327855","full_name":"aelithron/universal-status","owner":"aelithron","description":"Put your status on many platforms at once :3","archived":false,"fork":false,"pushed_at":"2026-05-23T16:32:55.000Z","size":435,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T18:18:56.888Z","etag":null,"topics":["api","minimalist","nextjs","status"],"latest_commit_sha":null,"homepage":"https://status.novatea.dev","language":"TypeScript","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/aelithron.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":"2025-07-27T19:43:30.000Z","updated_at":"2026-05-23T16:32:58.000Z","dependencies_parsed_at":"2025-09-14T04:16:15.917Z","dependency_job_id":"dd1451c1-8e2e-460b-a451-cb37b6039722","html_url":"https://github.com/aelithron/universal-status","commit_stats":null,"previous_names":["aelithron/universal-status"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/aelithron/universal-status","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aelithron%2Funiversal-status","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aelithron%2Funiversal-status/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aelithron%2Funiversal-status/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aelithron%2Funiversal-status/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aelithron","download_url":"https://codeload.github.com/aelithron/universal-status/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aelithron%2Funiversal-status/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34513020,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"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":["api","minimalist","nextjs","status"],"created_at":"2026-06-19T00:30:48.005Z","updated_at":"2026-06-19T00:30:51.266Z","avatar_url":"https://github.com/aelithron.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Universal Status\nPut your status on many platforms at once :3\n\n![IMG](https://hackatime-badge.hackclub.com/U08RJ1PEM7X/universal-status)\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://shipwrecked.hackclub.com/?t=ghrm\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://cdn.hackclub.com/019d0cad-479a-7355-a7fc-bb822264d1e1/image.png\" \n         alt=\"This project is part of Shipwrecked, the world's first hackathon on an island!\" \n         style=\"width: 35%;\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n(I'm also shipping some new work on this to [Fudge Fudge Fudge](https://fudge.hackclub.com/), another Hack Club event :3c)\n\n## Features\n- Status history\n- Expiring statuses\n- Minimalist user interface\n- Updates your status on other platforms\n  - Slack (via OAuth)\n  - GitHub (via OAuth)\n  - Status.Cafe (via direct authentication)\n- Coming soon platforms:\n  - Discord (via [Rich Presence](https://github.com/aelithron/universal-status-discord))\n  - possibly others\n- Simple APIs for reading and writing statuses (both REST and GraphQL)\n## Usage\nThe app is quite easy to use! Go to [status.novatea.dev](https://status.novatea.dev) and sign in with either Discord (suggested), GitHub, or (only if you are in Hack Club) Slack. Then, if you want to store status updates on other platforms, go to the Settings page and authorize accounts on other platforms.\n### Selfhosting\nSelfhosting the app is a bit more complex, but can be done! I suggest using Docker, and these instructions are for a Docker image.\n1. Set up the following environment variables:\n- `MONGODB_URI`: A MongoDB connection string to your database server.\n- `MONGODB_DB`: The name of your database. Make sure it contains a collection called `statuses`!\n- `AUTH_SECRET`: A random string to secure user sessions. You can generate this with the command `openssl rand -base64 33` on Linux.\n- `AUTH_URL`: The URL of your app, formatted as `https://[domain].[tld]`. You can add a subdomain if your instance is on one, and **DO NOT** add an extra slash at the end.\n- `DISCORD_ID` and `DISCORD_SECRET`: Optional, a Discord OAuth ID and Secret. This will enable Discord login. You can configure this on the [Discord Developers panel](https://discord.com/developers/applications), make sure to create an application and follow their setup. Your OAuth2 Redirect is `https://[domain].[tld]/api/auth/callback/discord`.\n- `SLACK_ID` and `SLACK_SECRET`: Optional, a Slack OAuth ID and Secret. This enables Slack login, as well as the ability to set statuses on Slack. You can create a Slack app and add its ID and secret here. No links are provided, as it's a complicated process to set up. Your redirect URLs are `https://[domain].[tld]/api/auth/callback/slack` and `https://[domain].[tld]/api/provider/slack` (add both to the box).\n- `GITHUB_ID` and `GITHUB_SECRET`: Optional, a GitHub App ID and Secret. This enables setting statuses on GitHub, as well as login. You can create a GitHub **OAuth app** and add its ID and secret here. Configure an app on the [GitHub developer portal](https://github.com/settings/developers), and your redirect URL is `https://[domain].[tld]/api`. *Note that GitHub Apps will not work, you must create an OAuth App instead.*\n2. You can use either of the below methods to quickly deploy.\n**Make sure to fill in the empty quotation marks with the environment variables from step 1!**\nAlso, optional variables are commented out, but you can uncomment them to use them.\n**Finally, make sure you enable at least one authentication method!**\n#### With Docker Compose\nCopy the following Compose file to your server or computer, and name it `compose.yaml`:\n```yaml\nservices:\n  universal-status:\n    image: ghcr.io/aelithron/universal-status:latest\n    container_name: universal-status\n    restart: unless-stopped\n    environment:\n      MONGODB_URI: \"\"\n      MONGODB_DB: \"\"\n      AUTH_SECRET: \"\"\n      AUTH_URL: \"\"\n      # DISCORD_ID: \"\"\n      # DISCORD_SECRET: \"\"\n      # SLACK_ID: \"\"\n      # SLACK_SECRET: \"\"\n      # GITHUB_ID: \"\"\n      # GITHUB_SECRET: \"\"\n    ports:\n      - 3000:3000\n```\nThen, simply run `docker compose up -d` in the directory of the file!\n#### With `docker run`\nRun the following command on your server or computer:\n```bash\ndocker run -d \\\n  --name universal-status \\\n  -p 3000:3000 \\\n  -e MONGODB_URI=\"\" \\\n  -e MONGODB_DB=\"\" \\\n  -e AUTH_SECRET=\"\" \\\n  -e AUTH_URL=\"\" \\\n  # -e DISCORD_ID=\"\" \\\n  # -e DISCORD_SECRET=\"\" \\\n  # -e SLACK_ID=\"\" \\\n  # -e SLACK_SECRET=\"\" \\\n  # -e GITHUB_ID=\"\" \\\n  # -e GITHUB_SECRET=\"\" \\\n  --restart unless-stopped \\\n  ghcr.io/aelithron/universal-status:latest\n```\n- Note: If you want to use something else (like Kubernetes), the Docker image can be found on the Packages tab (or simply pulled as `ghcr.io/aelithron/universal-status:latest`). Make sure to include the environment variables!\n## Screenshot\n![IMG](https://hc-cdn.hel1.your-objectstorage.com/s/v3/9154f332f0b0e82d_image.png)\n## Credits\n- Inspired by EchoFeed and Status.Cafe\n- Icons from Font Awesome\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faelithron%2Funiversal-status","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faelithron%2Funiversal-status","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faelithron%2Funiversal-status/lists"}