diff --git a/AGENTS.md b/AGENTS.md index 0c8cf47..774dbcb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -108,6 +108,15 @@ When the human is ready to publish, they use the PlotLink OWS app to upload stor You focus on the writing. The human handles publishing. +### After Publishing + +After a storyline is created, inform the user they can customize it on the PlotLink website: + +- **Story URL**: `https://plotlink.xyz/story/{storylineId}` +- The **Edit Details** button is available to the story author when connected with their wallet +- Editable fields: cover image (WebP/JPEG, max 500KB, recommended 600x900px), genre, language, NSFW flag +- Uploading a cover image significantly improves the story's visibility on PlotLink + ## Content Flags ### NSFW Content diff --git a/README.md b/README.md index a0365d2..e8aad4e 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@

Live App · Quick Start · + Wallet Setup · How it Works · OWS Docs

@@ -116,6 +117,49 @@ npx plotlink-ows status # Show config + wallet info --- +## 🔑 Wallet Setup + +PlotLink OWS uses an encrypted local wallet via Open Wallet Standard. No raw private keys are exposed to scripts or environment variables. + +### Initial Setup + +```bash +npx plotlink-ows init +``` + +The setup wizard will: +1. Ask you to create a passphrase (encrypts your wallet at rest) +2. Generate a new OWS wallet in `~/.ows/` +3. Display your Base (L2) wallet address + +### Funding Your Wallet + +Send a small amount of ETH on **Base** to your wallet address. Publishing costs less than $0.05 per story. + +You can bridge ETH from Ethereum mainnet to Base using the [official Base Bridge](https://bridge.base.org) or any supported bridge. + +### Environment Variables + +| Variable | Required | Description | +|----------|----------|-------------| +| `OWS_PASSPHRASE` | Yes | Your wallet encryption passphrase | +| `NEXT_PUBLIC_RPC_URL` | No | Custom Base RPC URL (defaults to `https://mainnet.base.org`) | +| `NEXT_PUBLIC_APP_URL` | No | PlotLink API URL (defaults to `https://plotlink.xyz`) | + +Copy `.env.example` to `.env` and fill in your values: + +```bash +cp .env.example .env +``` + +> **Security best practices:** +> - Never share your passphrase or wallet files with anyone +> - Use a dedicated wallet for agent operations — do not reuse your main wallet +> - Never commit `.env` or wallet files to version control +> - Store backups of `~/.ows/` in a secure, offline location + +--- + ## 🏗️ Architecture ``` diff --git a/app/web/components/Layout.tsx b/app/web/components/Layout.tsx index 80d5345..91e8244 100644 --- a/app/web/components/Layout.tsx +++ b/app/web/components/Layout.tsx @@ -174,6 +174,17 @@ export function Layout({ token, onLogout }: { token: string; onLogout: () => voi +
+ + Wallet Setup Guide + +
+ )} diff --git a/packages/cli/src/commands/create.ts b/packages/cli/src/commands/create.ts index b171a7e..ac46175 100644 --- a/packages/cli/src/commands/create.ts +++ b/packages/cli/src/commands/create.ts @@ -26,6 +26,9 @@ export function registerCreate(program: Command): void { console.log(` ID: ${result.storylineId}`); console.log(` TX: ${result.txHash}`); console.log(` CID: ${result.contentCid}`); + console.log(); + console.log("Upload a cover image and edit details at:"); + console.log(` https://plotlink.xyz/story/${result.storylineId} → Edit Details`); } catch (err) { console.error(`Error: ${err instanceof Error ? err.message : String(err)}`); process.exit(1);