{"id":14139336,"url":"https://github.com/mvdicarlo/postybirb","last_synced_at":"2026-06-26T18:00:36.050Z","repository":{"id":28961069,"uuid":"119847449","full_name":"mvdicarlo/postybirb","owner":"mvdicarlo","description":"PostyBirb is an application that helps artists post art and other multimedia to multiple websites more quickly. The overall goal of PostyBirb is to cut down on the time it takes to post submissions to multiple websites.","archived":false,"fork":false,"pushed_at":"2026-06-26T12:15:13.000Z","size":25941,"stargazers_count":397,"open_issues_count":39,"forks_count":56,"subscribers_count":20,"default_branch":"main","last_synced_at":"2026-06-26T13:21:31.189Z","etag":null,"topics":["electron","javascript","postybirb","react"],"latest_commit_sha":null,"homepage":"https://www.postybirb.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mvdicarlo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing/add-a-website/README.md","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":"2018-02-01T14:35:01.000Z","updated_at":"2026-06-26T12:01:06.000Z","dependencies_parsed_at":"2023-10-11T14:01:05.413Z","dependency_job_id":"a8ff5d74-e105-4f86-b866-fbbf48b2a327","html_url":"https://github.com/mvdicarlo/postybirb","commit_stats":null,"previous_names":[],"tags_count":167,"template":false,"template_full_name":null,"purl":"pkg:github/mvdicarlo/postybirb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdicarlo%2Fpostybirb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdicarlo%2Fpostybirb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdicarlo%2Fpostybirb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdicarlo%2Fpostybirb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mvdicarlo","download_url":"https://codeload.github.com/mvdicarlo/postybirb/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mvdicarlo%2Fpostybirb/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34827535,"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-26T02:00:06.560Z","response_time":106,"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":["electron","javascript","postybirb","react"],"created_at":"2024-08-16T17:01:00.914Z","updated_at":"2026-06-26T18:00:36.044Z","avatar_url":"https://github.com/mvdicarlo.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Postybirb\n\n\u003cdiv style='flex: 1'\u003e\n\u003ca href=\"https://discord.com/invite/FUdN7JCr2f\"\u003e\n\u003cimg alt=\"Static Badge\" src=\"https://img.shields.io/badge/discord-%2323272a?logo=discord\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://github.com/mvdicarlo/postybirb/releases/latest\"\u003e\n\u003cimg alt=\"GitHub Downloads (all assets, latest release)\" src=\"https://img.shields.io/github/downloads/mvdicarlo/postybirb/latest/total\"\u003e\n\u003c/a\u003e\n\u003ca href=\"https://hosted.weblate.org/engage/postybirb/\"\u003e\n\u003cimg src=\"https://hosted.weblate.org/widget/postybirb/svg-badge.svg\" alt=\"Translation status\" /\u003e\n\u003c/a\u003e\n\u003cimg alt=\"GitHub Actions Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/mvdicarlo/postybirb/build.yml\"\u003e\n\u003c/div\u003e\n\n## About\n\nPostyBirb is an application that helps artists post art and other multimedia to\nmultiple websites more quickly. The overall goal of PostyBirb is to cut down on\nthe time it takes to post submissions to multiple websites.\n\n## Features\n\nPostyBirb supports a wide range of websites, see the full list [here](./apps/client-server/src/app/websites/implementations).\n\n- 🌐 Submission templates – Configure default values for each website once, reuse across submissions.\n- 🏷️ Tag groups – Save and apply multiple tags at once.\n- 🔄 Tag converters – Automatically rewrite tags per website.\n- 🔗 Username shortcuts – Tag people on socials easily.\n- ♻️ Username converters – Automatically rewrite usernames per website.\n- ⚡ Custom shortcuts – Create your own text snippets for descriptions.\n- ✍️ Description formatting – Apply bold, italics, color, etc. PostyBirb converts formatting to match each website's capabilities.\n- 🚀 Description preview – See how any of the features above with look with website specific formatting applied.\n- 📐 Autoscaling – Scales images automatically.\n- 📄 File \u0026 notification posts – Supports both media uploads and text‑only posts.\n- 📅 Scheduling – Post at exact dates or repeating intervals. Login credentials stay on your device, and PostyBirb must be running for scheduled posts to go out - your credentials remain private and under your control.\n- 🐳 Docker self‑host / remote – Advanced users can run PostyBirb on their own server with Docker. Scheduled posts work even when your main device is off, and you can access the same instance from multiple devices (e.g., start a draft on desktop, finish and schedule it from a laptop). [Detailed documentation on remote, Docker, and headless setup](./docs/DOCKER.md)\n- 👁️ Directory watcher – Automatically creates a submission when a new file appears in a watched directory.\n\n## V4 Initiative\n\nv4 sets out to be more flexible for adding new features and updates not easily\nsupported on v3. It also aims to be more contributor friendly and ease the\nimplementation of websites where possible.\n\n## Looking for v3 (PostyBirb+)?\n\nYou can find v3 [here](https://github.com/mvdicarlo/postybirb-plus).\n\n## Translation\n\n![Translation status badge](https://hosted.weblate.org/widget/postybirb/postybirb/287x66-black.png)\n\nPostyBirb uses [Weblate](https://hosted.weblate.org/projects/postybirb/postybirb/) as transltion service\n\nLearn more: [Translation guide](./TRANSLATION.md)\n\n## Contributing\n\nPlease write clean code.\n\nFollow [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/)\n\n## Project Setup\n\n1. Ensure your NodeJS version is 24.6.0 or higher\n2. Clone project using git\n3. Ensure corepack is installed: `npm --global install corepack` (This is tool used for managing package manager's versions)\n4. `corepack enable` Makes NodeJS use the yarn version specific to the project (from package.json)\n5. `yarn install` Installs dependencies\n6. If it fails with `➤ YN0009: │ better-sqlite3@npm:11.8.0 couldn't be built successfully`: \u003csummary\u003e\n\n  \u003cdetails\u003e\n       If you're on windows run\n\n```\nwinget install -e --id Microsoft.VisualStudio.2022.BuildTools --override \"--passive --wait --add Microsoft.VisualStudio.Workload.VCTools;includeRecommended\"\n```\n\nIf you're on linux or other OS please create an issue with log from the unsucessfull build. It will have instructions on which packages are required and we will add them there. But generally it should work out of box if you have C++ compiler installed\n\n  \u003c/details\u003e\n\n\u003c/summary\u003e\n\n7. `yarn run setup` Installs hooks/husky\n8. `yarn start` Starts app\n\n## Common commands\n\n- Run tests/format/lint: `yarn test`/`yarn format`/`yarn lint`\n- Build \u0026 Package app: `yarn dist`\n\n### Native module mismatch after packaging\n\nRunning `yarn dist` (or any `dist:*` variant) calls `electron-builder install-app-deps` as part of the packaging step. This rebuilds native modules (e.g. `better-sqlite3`) for **Electron's embedded Node.js**, which has a different `NODE_MODULE_VERSION` than your system Node.\n\nAfter packaging, if you run `yarn test` and get an error like:\n\n```txt\nThe module '...better_sqlite3.node' was compiled against a different Node.js version using NODE_MODULE_VERSION 133. This version of Node.js requires NODE_MODULE_VERSION 137.\n```\n\nthe fix is to reinstall dependencies, which restores the system-Node-compatible binary:\n\n```bash\nrm -rf node_modules \u0026\u0026 yarn install\n```\n\nThis is expected behaviour — the packaging step intentionally overwrites the binary for Electron. Tests always need the system-Node binary, so a fresh install after packaging is required before running tests again.\n\n### Recommended Plugins (VSCode)\n\n- Nx Console\n- Jest Runner\n- Prettier\n\n### Add website\n\nTo add a new website [see this guide](./contributing/add-a-website)\n\n## Primary Modules (/apps)\n\n### Client-Server\n\nThe \"Back end\" of the application. This houses all website implementations, data models, user settings,\nposting logic, etc.\n\n#### Primary Technologies Used\n\n- NestJS\n- Drizzle (sqlite3)\n\n### Postybirb\n\nThe Electron part of the application that contains initialization logic and\napp setup.\n\n#### Primary Technologies Used\n\n- Electron\n\n### PostyBirb-UI\n\nThe user interface for the application that talks with Client-Server through\nweb-socket and https.\n\n#### Primary Technologies Used\n\n- React\n- TipTap (Text editor)\n- Mantine (UI Framework)\n\n### PostyBirb-Cloud-Server\n\nUsed for functions that are impossible to implement without having a dedicated server (e.g. hosting images for Instagram uploads)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmvdicarlo%2Fpostybirb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmvdicarlo%2Fpostybirb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmvdicarlo%2Fpostybirb/lists"}