ads-crosspost
by miklosp
README.md
# ads-crosspost
Post one second-hand item to Blocket, Tradera, Vinted and Facebook Marketplace from a single chat with Claude.
You describe the item and drop in photos. Claude interviews you for anything missing and writes the ad in Swedish and English. It then picks each site's category and fields from snapshots of the real forms. A small macOS tray app fills in each site's form in its own browser, shows you a screenshot, and publishes only after you say yes.
> [!warning] Experimental
> This is a personal tool I built to scratch my own itch, published as-is. There is no signed or notarized build yet, so you build the app from source. Expect rough edges, and expect a flow to break whenever a site changes its form.
## How it works
The LLM never clicks around the sites. It writes the text and chooses categories. Posting replays browser flows that I recorded by hand, one per site, with [patchright](https://github.com/Kaliiiiiiiiii-Vinyzu/patchright) (a Playwright fork) driving a headed Chromium.
- **Tray app** (Electron). Runs a local MCP server on `127.0.0.1` behind a bearer token, one browser profile per site, and a job queue.
- **Hosts.** Claude Desktop (chat and Cowork) and ChatGPT desktop connect through a small stdio shim that the tray app writes into their config. The shim starts the app if it isn't running.
- **Publish gate.** Every post stops at `ready_to_publish` with a screenshot of the filled form. Nothing goes live until you approve it in the chat.
- **Your data stays local.** Items, photos, logins and settings live in `~/Library/Application Support/ads-crosspost/`. The server listens on localhost only.
The longer story is in [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) and [docs/DESKTOP-APP.md](docs/DESKTOP-APP.md).
## Before you use it
All four sites restrict automated use in their terms to some degree. This tool posts at human pace, one item at a time, in a real headed browser that you logged into yourself. That lowers the risk. It doesn't remove it: an account can still get flagged or limited. Use it on your own accounts, for your own things, and decide for yourself whether that risk is fine.
Some other limits:
- **Facebook** caps private sellers at 20 Marketplace listings a month.
- **Blocket** charges for ads in the Fordon category (cars, motorcycles, boats and so on), so this tool doesn't support vehicles. Fordonstillbehör (parts and accessories) is free and works.
- **Tradera** supports fixed-price listings only. The auction flow isn't recorded.
- **Vinted** is shipping-only, so items without shipping skip it.
- Sites are in Swedish, and prices are in SEK.
## Get started
[docs/QUICKSTART.md](docs/QUICKSTART.md) takes you from a fresh clone to your first posted ad in about 15 minutes.
You need macOS (only tested on Apple silicon), Node 22.18 or newer, and pnpm.
## Command line
The CLI predates the app and still works on items stored in the repo checkout:
```sh
pnpm run login blocket # log in by hand once per site
pnpm post <slug> --platform all --dry-run # fill the forms, screenshot, don't publish
pnpm post <slug> --platform all # publish
```
Items live in `items/<slug>/item.yaml` (gitignored). The `post-ad` skill in `.claude/skills/` writes them from Claude Code. `pnpm import-data <checkout>` moves a CLI checkout's items, logins and config into the app.
## Development
```sh
pnpm install
pnpm test # unit tests
pnpm typecheck
pnpm app:dev # build and run the tray app
pnpm app:smoke # start the MCP server and shim under plain node, list tools
pnpm app:dist # unsigned arm64 .dmg in dist/
```
Signed releases are covered in [docs/RELEASING.md](docs/RELEASING.md). The per-site form fields in `src/platforms/*.fields.json` are generated by `pnpm discover <platform>`. [docs/FIELDS.md](docs/FIELDS.md) explains the format.
## Roadmap
- A signed and notarized macOS build, so you can install without building from source.
- Deactivating or removing a listing once the item is sold, on every site it was posted to.
## License
[MIT](LICENSE).
This server cannot be deployed
Maintenance
ActivityMaintained
ResponsivenessNo issues