3.4 KiB
PolyNote · Polygon message pusher
Send hex-encoded messages on Polygon mainnet using the Trust Wallet browser extension or in-app browser. The app builds a zero-value transaction with your message in the data field, so only gas is spent.
What it does
- Connects to an injected EIP-1193 provider (Trust Wallet) and targets Polygon mainnet.
- Hex-encodes up to 280 characters and sends a 0 MATIC transaction carrying the payload.
- Internationalization (English, Spanish, French, German, Italian, Swedish) with a locale picker and auto language detection.
- Live feedback, copy-to-clipboard for the tx hash, Polygonscan deep links, and a session “recent messages” view.
- Light/Dark theme toggle.
Stack
- Next.js 15 (App Router), React 18, TypeScript
- Ethers v6
- Styling via a single CSS file (
app/globals.css) - Path alias:
@/→app/ - Lint: ESLint 9 (flat config), Prettier
Getting started
- Install pnpm and Node 18+ (Node 24 recommended).
- Install deps:
pnpm install - Run dev:
The dev script guards against a missing
pnpm dev -- --hostname 127.0.0.1 --port 3120.next/server/middleware-manifest.json. - Open the URL, pick a language, connect Trust Wallet, type a message, and send. Only gas is charged.
Scripts
pnpm dev– start dev server (with manifest guard)pnpm build– production build (skips lint, run lint separately)pnpm start– run the production serverpnpm lint– ESLint flat configpnpm format– Prettier check
Project layout
app/page.tsx– main UI/logicapp/components/LocaleSelector.tsx– locale dropdownapp/hooks/useI18n.ts,app/hooks/useTheme.ts– i18n + theme togglesapp/locales/*.json– translationsapp/globals.css– stylesscripts/ensure-middleware-manifest.cjs– guards against missing Next middleware manifest on fresh starts
Configuration
No env vars required. Wallet connectivity is via the injected Trust Wallet provider; WalletConnect is not used.
Docker
The Dockerfile is multi-stage and uses pnpm:
docker build -t polynote .
# run
docker run -p 3000:3000 polynote
BuildKit with cache mounts is supported in the Dockerfile, but if buildx isn’t available locally, use the plain docker build command above.
CI (Gitea actions)
.gitea/workflows/build.yml runs lint on Node 22, then builds and uploads .next/standalone + .next/static + public as artifacts for main and tags.
Security notes
- Only injected providers are used; no secrets leave the browser.
- Recipient addresses validated with
ethers.isAddress. - Zero-value tx; user pays gas. The app requests a switch to Polygon (chainId 137).
- Copy-to-clipboard is wrapped in error handling.
- Serve over HTTPS in production so wallet and clipboard APIs work reliably.
- Sending data to an EOA can be blocked by some wallets/RPCs; a warning is shown when you target your own address.
Path aliases
Imports under app/ can use @/ (configured in tsconfig.json):
import en from "@/locales/en.json";
import { LocaleSelector } from "@/components/LocaleSelector";
Contributing
PRs welcome. Run pnpm format and pnpm lint before submitting. If you add locales, extend the JSON files under app/locales/.
License
GPL-3.0 (see LICENSE). Core dependencies are permissive (MIT): Next.js, React, React DOM, ethers, Prettier, TypeScript, @types/*.