{"id":50373669,"url":"https://github.com/beeper/pickle","last_synced_at":"2026-05-30T08:30:25.492Z","repository":{"id":355061060,"uuid":"1219540224","full_name":"beeper/pickle","owner":"beeper","description":"TypeScript SDK for Matrix","archived":false,"fork":false,"pushed_at":"2026-05-24T21:31:47.000Z","size":1570,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-24T23:25:05.833Z","etag":null,"topics":["matrix","mautrix","mautrix-go"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beeper.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","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":"2026-04-24T01:26:09.000Z","updated_at":"2026-05-24T16:39:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/beeper/pickle","commit_stats":null,"previous_names":["batuhan/better-matrix-js","beeper/pickle"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/beeper/pickle","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beeper%2Fpickle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beeper%2Fpickle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beeper%2Fpickle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beeper%2Fpickle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beeper","download_url":"https://codeload.github.com/beeper/pickle/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beeper%2Fpickle/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33686018,"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-05-30T02:00:06.278Z","response_time":92,"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":["matrix","mautrix","mautrix-go"],"created_at":"2026-05-30T08:30:24.641Z","updated_at":"2026-05-30T08:30:25.482Z","avatar_url":"https://github.com/beeper.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pickle\n\nA TypeScript Matrix SDK that runs anywhere. Built on `mautrix-go` + `goolm` compiled to WebAssembly. **E2EE works out of the box.** No `matrix-js-sdk`, no Rust sidecar, no Node FFI.\n\n## Packages\n\n| Package | What it does |\n| --- | --- |\n| [`@beeper/pickle`](packages/pickle) | Matrix SDK: login, sync, rooms, messages, reactions, threads, media, E2EE. |\n| [`@beeper/pickle-chat-adapter`](packages/chat-adapter) | Build Matrix bots using the [Chat SDK](https://www.npmjs.com/package/chat). |\n| [`@beeper/pickle-ag-ui`](packages/ag-ui) | Pipe AG-UI streams into Matrix messages. |\n| [`@beeper/pickle-state-file`](packages/state-file) · [`-sqlite`](packages/state-sqlite) · [`-indexeddb`](packages/state-indexeddb) · [`-memory`](packages/state-memory) · [`-simple`](packages/state-simple) | State adapters for Node, browsers, and custom backends. |\n\n## Install\n\n```sh\nnpm install @beeper/pickle @beeper/pickle-state-sqlite\n```\n\n## A Node bot in 20 lines\n\n```ts\nimport { createMatrixClient, onMessage } from \"@beeper/pickle/node\";\nimport { createSQLiteMatrixStore } from \"@beeper/pickle-state-sqlite\";\n\nconst client = createMatrixClient({\n  homeserver: \"https://matrix.example.org\",\n  token: process.env.MATRIX_ACCESS_TOKEN!,\n  store: await createSQLiteMatrixStore(\".matrix-state/bot.db\"),\n  recoveryKey: process.env.MATRIX_RECOVERY_KEY, // optional, for E2EE history\n});\n\nawait onMessage(client, undefined, async (event) =\u003e {\n  if (event.sender.isMe) return;\n  await client.messages.send({\n    roomId: event.roomId,\n    text: `echo: ${event.text}`,\n    replyTo: event.eventId,\n  });\n});\n```\n\nThat's a working E2EE-capable Matrix bot. The first awaited method boots WASM, store, and crypto lazily — call `await client.boot()` if you want startup failures up front.\n\n## With the Chat SDK\n\nSame bot, written as a [Chat SDK](https://www.npmjs.com/package/chat) adapter — gets you Slack/Discord/Teams parity and shared bot logic across platforms:\n\n```sh\nnpm install chat @beeper/pickle @beeper/pickle-chat-adapter\n```\n\n```ts\nimport { Chat } from \"chat\";\nimport { createMatrixAdapter } from \"@beeper/pickle-chat-adapter\";\n\nconst matrix = createMatrixAdapter({\n  homeserver: \"https://matrix.example.org\",\n  token: process.env.MATRIX_ACCESS_TOKEN!,\n});\n\nconst bot = new Chat({ adapters: { matrix }, state });\n\nbot.onNewMention(async (thread, message) =\u003e {\n  await thread.subscribe();\n  await thread.post(`echo: ${message.text}`);\n});\n\nawait bot.initialize();\n```\n\n## What works\n\n- Node bots and browser apps\n- Login (password, token, JWT) and Beeper registration\n- `/sync` long polling with shared subscriptions and catch-up\n- Send / edit / redact, replies, mentions, reactions, threads, typing, receipts\n- Encrypted media upload and download\n- Full E2EE (Olm, Megolm, cross-signing, key backup, recovery key)\n- Beeper native streaming + ephemeral events\n- Streaming AI responses (debounced edits everywhere; native on Beeper)\n\n## What's not supported\n\n- URL previews (send rendered content explicitly)\n\n## Examples\n\n- [`examples/dummybridge-bot`](examples/dummybridge-bot) — full-featured Node bot using Pickle directly.\n- [`examples/beeper-streaming-smoke`](examples/beeper-streaming-smoke) — Chat SDK adapter streaming rich markdown.\n\n## Develop\n\n```sh\npnpm install\npnpm build       # TS + Go WASM\npnpm test\npnpm typecheck\n```\n\nLive Matrix smoke tests live in [`e2e`](e2e) and are opt-in because they need\nreal accounts.\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the release flow.\n\n## License\n\nSee [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeeper%2Fpickle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeeper%2Fpickle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeeper%2Fpickle/lists"}