Join the Agent Deck Discord Server!
Check out the Agent Deck community on Discord – hang out with 357 other members and enjoy free voice and text chat.
Peer-to-peer messaging with nothing in the middle.
SocialTypeScript · SolidityGitHub @deepso7OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗QOP is a simple, minimal and secure messaging app built on top of minip2p.
Messages travel peer to peer. Identity lives on chain. A small API sponsors invitation-gated registration and later phone-approved add/remove device actions. It never holds owner secrets and does not choose pairing endpoints.
contracts/). A Solidity contract maps a permanent handle to an owner address and raw Ed25519 device keys. It is the single source of truth for who owns which handle. Registration starts invitation gated and can be opened permanently by the registration admin.api/). Verifies owner-signed EIP-712 intents and relays gas for registration and add/remove device actions. Clients still confirm account and device membership over RPC.mobile/). An Expo app that generates keys on device, registers through the API, links additional devices, resolves peers from the chain, and chats over minip2p. Each transport connection is verified against the registry with a bounded authorization cache.cli/). Links a separate device key with phone approval, then runs as the same account. Phone-composed text can be handed off to a reachable CLI over /qop/sync/1; the CLI persists it in messages.db and retries while it runs.packages/identity/). Shared key derivation, EIP-712 domains and intents, recovery key encoding, and wire codecs.packages/protocol/). Pairing codecs and the shared registry/session/chat pieces used by phone and CLI.| Path | Package | Description |
|---|---|---|
contracts/ | Foundry | QOPIdentityRegistry and its protocol tests |
api/ | @qop/api | Registration and device-action relay service (Effect, Postgres, viem) |
cli/ | @qop/cli | Phone-approved device linking and diagnostic chat |
mobile/ | mobile | Expo app (Expo Router, minip2p, Effect) |
packages/identity/ | @qop/identity | Identity primitives shared by the API, CLI, and app |
packages/protocol/ | @qop/protocol | Pairing, registry reads, and live-session authorization |
web/ | @qop/web | The qop.sh site and docs (Blume) |
Each package has its own README with details on configuration and operation.
Clone the repo, pull the contract submodules, and install dependencies:
git submodule update --init --recursive
pnpm install
Start Anvil, then deploy the registry. For local development the admin and signer may be Anvil test accounts.
anvil
REGISTRATION_ADMIN=0x... \
REGISTRATION_SIGNER=0x... \
forge script --root contracts contracts/script/DeployQOPIdentityRegistry.s.sol:DeployQOPIdentityRegistry \
--broadcast \
--private-key 0x... \
--rpc-url http://127.0.0.1:8545
Note the deployed registry address. See contracts/README.md for the full policy and deployment requirements.
Copy api/.env.example to api/.env, then set the registry address, chain ID, RPC URL, database URL, and the two private keys. REGISTRATION_PRIVATE_KEY must match the REGISTRATION_SIGNER used at deploy time. RELAYER_PRIVATE_KEY pays gas and should be a separate, funded key.
pnpm --filter @qop/api db:push
pnpm --filter @qop/api admission:create
pnpm --filter @qop/api dev
admission:create prints a single use code to hand to a user. See api/README.md for the registration flow and routes.
Copy mobile/.env.example to mobile/.env and point EXPO_PUBLIC_API_URL, EXPO_PUBLIC_RPC_URL, EXPO_PUBLIC_REGISTRY_ADDRESS, and EXPO_PUBLIC_REGISTRY_CHAIN_ID at the services above. Physical devices and emulators need addresses that can reach your development machine, so 127.0.0.1 usually does not work.
pnpm --filter mobile ios
pnpm --filter mobile android
Both commands build a native development client and connect it to Metro. See mobile/README.md for the manual verification checklist that exercises the native transport.
pnpm check # lint, package tests, and typecheck
pnpm check:contracts # forge fmt, lint, and tests
pnpm fix # apply lint and format fixes
Automated tests cover the identity library, the API, the SQL and store lifecycle in the app, and the contract. They do not exercise the native P2P transport, which needs two development builds.