From 75e02e457d340542e0caa046974c33cc8cdbb400 Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 09:59:08 +0100 Subject: [PATCH 1/8] feat(frontend): add server-side OpenClaw library for in-app API routes Port the standalone service's read-only Stacks client (get-stream, claimable/streamed/remaining/refundable, sender/recipient lookups, stream nonce, DAO reads, block height), formatting helpers, request validation patterns, and the opaque error-ref handler into a single server-only module. Response shapes stay identical to the Express service so the widget needs no changes. --- frontend/src/lib/openclaw-server.ts | 266 ++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 frontend/src/lib/openclaw-server.ts diff --git a/frontend/src/lib/openclaw-server.ts b/frontend/src/lib/openclaw-server.ts new file mode 100644 index 0000000..ddc3a88 --- /dev/null +++ b/frontend/src/lib/openclaw-server.ts @@ -0,0 +1,266 @@ +/** + * Server-side OpenClaw logic, ported from openclaw-service so the API can run + * as Next.js route handlers on the same Vercel deployment (no separate host). + * Response shapes are kept identical to the standalone Express service. + */ +import { + fetchCallReadOnlyFunction, + cvToJSON, + uintCV, + principalCV, + type ClarityValue, +} from "@stacks/transactions"; + +// ============================================================================ +// Config +// ============================================================================ + +const NETWORK = (process.env.NEXT_PUBLIC_NETWORK ?? "mainnet") as + | "testnet" + | "mainnet"; +const IS_MAINNET = NETWORK === "mainnet"; + +const CONTRACT_DEPLOYER = + process.env.NEXT_PUBLIC_CONTRACT_DEPLOYER ?? + "SP2V6TCRFTYQHP8F4D9HSFZHRQNGVBQEZR0TMSM79"; + +const STREAM_MANAGER_CONTRACT = `${CONTRACT_DEPLOYER}.stream-manager`; +const STREAM_FACTORY_CONTRACT = `${CONTRACT_DEPLOYER}.stream-factory`; + +const HIRO_API_BASE = IS_MAINNET + ? "https://api.mainnet.hiro.so" + : "https://api.testnet.hiro.so"; + +export function getNetwork() { + return IS_MAINNET ? "mainnet" : "testnet"; +} + +// ============================================================================ +// Read-only contract calls +// ============================================================================ + +function splitContract(contractId: string): [string, string] { + const [addr, name] = contractId.split("."); + return [addr, name]; +} + +async function callReadOnly( + contractId: string, + functionName: string, + args: ClarityValue[] = [] +) { + const [contractAddress, contractName] = splitContract(contractId); + const result = await fetchCallReadOnlyFunction({ + contractAddress, + contractName, + functionName, + functionArgs: args, + senderAddress: contractAddress, + network: getNetwork(), + }); + return cvToJSON(result); +} + +export interface StreamData { + sender: string; + recipient: string; + token: string; + depositAmount: bigint; + withdrawnAmount: bigint; + startBlock: number; + endBlock: number; + ratePerBlock: bigint; + status: number; + pausedAtBlock: number; + totalPausedDuration: number; + createdAtBlock: number; + memo: string | null; +} + +/* eslint-disable @typescript-eslint/no-explicit-any */ +function parseStreamData(raw: Record): StreamData { + return { + sender: raw.sender.value, + recipient: raw.recipient.value, + token: raw.token.value, + depositAmount: BigInt(raw["deposit-amount"].value), + withdrawnAmount: BigInt(raw["withdrawn-amount"].value), + startBlock: Number(raw["start-block"].value), + endBlock: Number(raw["end-block"].value), + ratePerBlock: BigInt(raw["rate-per-block"].value), + status: Number(raw.status.value), + pausedAtBlock: Number(raw["paused-at-block"].value), + totalPausedDuration: Number(raw["total-paused-duration"].value), + createdAtBlock: Number(raw["created-at-block"].value), + memo: raw.memo?.value?.value ?? null, + }; +} + +export async function getStream(streamId: number): Promise { + const result = await callReadOnly(STREAM_MANAGER_CONTRACT, "get-stream", [ + uintCV(streamId), + ]); + if (result.value === null) return null; + // cvToJSON nests an (optional (tuple ...)) as { value: { value: {fields} } } + // — the tuple fields live one level below the optional's unwrapped value. + return parseStreamData(result.value.value); +} + +async function readUintOrNull( + functionName: string, + streamId: number +): Promise { + const result = await callReadOnly(STREAM_MANAGER_CONTRACT, functionName, [ + uintCV(streamId), + ]); + if (result.value === null) return null; + return BigInt(result.value.value); +} + +export const getClaimableBalance = (id: number) => + readUintOrNull("get-claimable-balance", id); +export const getStreamedAmount = (id: number) => + readUintOrNull("get-streamed-amount", id); +export const getRemainingBalance = (id: number) => + readUintOrNull("get-remaining-balance", id); +export const getRefundableAmount = (id: number) => + readUintOrNull("get-refundable-amount", id); + +async function getAddressStreams( + functionName: string, + address: string +): Promise { + const result = await callReadOnly(STREAM_MANAGER_CONTRACT, functionName, [ + principalCV(address), + ]); + if (!result.value) return []; + return result.value.map((v: { value: string }) => Number(v.value)); +} + +export const getSenderStreams = (addr: string) => + getAddressStreams("get-sender-streams", addr); +export const getRecipientStreams = (addr: string) => + getAddressStreams("get-recipient-streams", addr); + +export async function getStreamNonce(): Promise { + const result = await callReadOnly(STREAM_MANAGER_CONTRACT, "get-stream-nonce"); + return Number(result.value); +} + +export interface DaoData { + name: string; + admin: string; + totalStreamsCreated: number; + totalDeposited: bigint; + createdAtBlock: number; + isActive: boolean; +} + +function parseDaoData(raw: Record): DaoData { + return { + name: raw.name.value, + admin: raw.admin.value, + totalStreamsCreated: Number(raw["total-streams-created"].value), + totalDeposited: BigInt(raw["total-deposited"].value), + createdAtBlock: Number(raw["created-at-block"].value), + isActive: raw["is-active"].value, + }; +} +/* eslint-enable @typescript-eslint/no-explicit-any */ + +export async function getDao(admin: string): Promise { + const result = await callReadOnly(STREAM_FACTORY_CONTRACT, "get-dao", [ + principalCV(admin), + ]); + if (result.value === null) return null; + // Same optional-of-tuple nesting as get-stream (see getStream above). + return parseDaoData(result.value.value); +} + +export async function getDaoCount(): Promise { + const result = await callReadOnly(STREAM_FACTORY_CONTRACT, "get-dao-count"); + return Number(result.value); +} + +export async function getCurrentBlockHeight(): Promise { + const res = await fetch(`${HIRO_API_BASE}/v2/info`, { cache: "no-store" }); + const data = (await res.json()) as { stacks_tip_height: number }; + return data.stacks_tip_height; +} + +// ============================================================================ +// Formatting helpers (mirrors openclaw-service/src/utils.ts) +// ============================================================================ + +export function formatTokenAmount( + amount: bigint | number, + decimals = 8, + displayDecimals = 6 +): string { + const num = typeof amount === "number" ? amount : Number(amount); + const value = num / Math.pow(10, decimals); + if (value === 0) return "0"; + if (value < 0.000001) return "< 0.000001"; + return value.toLocaleString("en-US", { + minimumFractionDigits: 2, + maximumFractionDigits: displayDecimals, + }); +} + +export function getStreamStatusLabel(status: number): string { + switch (status) { + case 0: + return "Active"; + case 1: + return "Paused"; + case 2: + return "Cancelled"; + case 3: + return "Depleted"; + default: + return "Unknown"; + } +} + +export function getStreamProgress( + startBlock: number, + endBlock: number, + currentBlock: number, + totalPausedDuration: number +): number { + const duration = endBlock - startBlock; + if (duration === 0) return 100; + const elapsed = Math.max(0, currentBlock - startBlock - totalPausedDuration); + return Math.min(100, Math.max(0, (elapsed / duration) * 100)); +} + +// ============================================================================ +// Route-handler helpers +// ============================================================================ + +export const STREAM_ID_RE = /^\d+$/; +export const STACKS_ADDRESS_RE = /^S[A-Z0-9]{38,40}$/; + +function bigIntReplacer(_key: string, value: unknown): unknown { + return typeof value === "bigint" ? value.toString() : value; +} + +export function jsonResponse(body: unknown, status = 200): Response { + return new Response(JSON.stringify(body, bigIntReplacer), { + status, + headers: { "content-type": "application/json" }, + }); +} + +// Never forward raw err.message to clients: internal errors can leak paths, +// SDK versions, and upstream URLs. Log with an opaque ref, return the ref only. +// (Mirrors openclaw-service error-handler, finding M-2.) +export function errorResponse(err: unknown): Response { + const ref = crypto.randomUUID(); + const message = err instanceof Error ? (err.stack ?? err.message) : String(err); + console.error(`[ERROR ${ref}] ${message}`); + if (err instanceof Error && err.message.includes("fetch")) { + return jsonResponse({ error: "Blockchain API unavailable", ref }, 502); + } + return jsonResponse({ error: "Internal server error", ref }, 500); +} From 553fca918ac6bf1ee53edd1ee7228ca15aed2657 Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 09:59:08 +0100 Subject: [PATCH 2/8] feat(frontend): stream lookup API routes GET /api/streams/[id] returns the full enriched stream (status label, claimable, streamed, remaining, refundable, progress, formatted amounts); /api/streams/sender/[address] and /api/streams/recipient/[address] return the stream ids an address touches. Input validated up front, 404 JSON when nothing exists. --- frontend/src/app/api/streams/[id]/route.ts | 68 +++++++++++++++++++ .../api/streams/recipient/[address]/route.ts | 25 +++++++ .../app/api/streams/sender/[address]/route.ts | 25 +++++++ 3 files changed, 118 insertions(+) create mode 100644 frontend/src/app/api/streams/[id]/route.ts create mode 100644 frontend/src/app/api/streams/recipient/[address]/route.ts create mode 100644 frontend/src/app/api/streams/sender/[address]/route.ts diff --git a/frontend/src/app/api/streams/[id]/route.ts b/frontend/src/app/api/streams/[id]/route.ts new file mode 100644 index 0000000..c421f54 --- /dev/null +++ b/frontend/src/app/api/streams/[id]/route.ts @@ -0,0 +1,68 @@ +import { + getStream, + getClaimableBalance, + getStreamedAmount, + getRemainingBalance, + getRefundableAmount, + getCurrentBlockHeight, + getStreamStatusLabel, + getStreamProgress, + formatTokenAmount, + jsonResponse, + errorResponse, + STREAM_ID_RE, +} from "@/lib/openclaw-server"; + +export const dynamic = "force-dynamic"; + +// GET /api/streams/:id — full stream data with computed fields +export async function GET( + _req: Request, + { params }: { params: Promise<{ id: string }> } +) { + try { + const { id: rawId } = await params; + if (!STREAM_ID_RE.test(rawId)) { + return jsonResponse({ error: "Invalid stream id" }, 400); + } + const id = Number(rawId); + + const stream = await getStream(id); + if (!stream) { + return jsonResponse({ error: "Stream not found" }, 404); + } + + const [claimable, streamed, remaining, refundable, currentBlock] = + await Promise.all([ + getClaimableBalance(id), + getStreamedAmount(id), + getRemainingBalance(id), + getRefundableAmount(id), + getCurrentBlockHeight(), + ]); + + const progress = getStreamProgress( + stream.startBlock, + stream.endBlock, + currentBlock, + stream.totalPausedDuration + ); + + return jsonResponse({ + streamId: id, + ...stream, + statusLabel: getStreamStatusLabel(stream.status), + claimable, + streamed, + remaining, + refundable, + currentBlock, + progress: Math.round(progress * 100) / 100, + depositFormatted: formatTokenAmount(stream.depositAmount), + claimableFormatted: + claimable !== null ? formatTokenAmount(claimable) : null, + }); + } catch (err) { + return errorResponse(err); + } +} diff --git a/frontend/src/app/api/streams/recipient/[address]/route.ts b/frontend/src/app/api/streams/recipient/[address]/route.ts new file mode 100644 index 0000000..e388fd1 --- /dev/null +++ b/frontend/src/app/api/streams/recipient/[address]/route.ts @@ -0,0 +1,25 @@ +import { + getRecipientStreams, + jsonResponse, + errorResponse, + STACKS_ADDRESS_RE, +} from "@/lib/openclaw-server"; + +export const dynamic = "force-dynamic"; + +// GET /api/streams/recipient/:address — streams where address is recipient +export async function GET( + _req: Request, + { params }: { params: Promise<{ address: string }> } +) { + try { + const { address } = await params; + if (!STACKS_ADDRESS_RE.test(address)) { + return jsonResponse({ error: "Invalid Stacks address" }, 400); + } + const ids = await getRecipientStreams(address); + return jsonResponse({ address, streamIds: ids, count: ids.length }); + } catch (err) { + return errorResponse(err); + } +} diff --git a/frontend/src/app/api/streams/sender/[address]/route.ts b/frontend/src/app/api/streams/sender/[address]/route.ts new file mode 100644 index 0000000..e884104 --- /dev/null +++ b/frontend/src/app/api/streams/sender/[address]/route.ts @@ -0,0 +1,25 @@ +import { + getSenderStreams, + jsonResponse, + errorResponse, + STACKS_ADDRESS_RE, +} from "@/lib/openclaw-server"; + +export const dynamic = "force-dynamic"; + +// GET /api/streams/sender/:address — streams where address is sender +export async function GET( + _req: Request, + { params }: { params: Promise<{ address: string }> } +) { + try { + const { address } = await params; + if (!STACKS_ADDRESS_RE.test(address)) { + return jsonResponse({ error: "Invalid Stacks address" }, 400); + } + const ids = await getSenderStreams(address); + return jsonResponse({ address, streamIds: ids, count: ids.length }); + } catch (err) { + return errorResponse(err); + } +} From d0dd2f1d874cd2964a0b9f8e5cc3a37c23237beb Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 09:59:08 +0100 Subject: [PATCH 3/8] feat(frontend): workspace lookup API route GET /api/daos/[admin] returns the registered DAO for an admin address with a formatted total-deposited figure, mirroring the standalone service's response. --- frontend/src/app/api/daos/[admin]/route.ts | 32 ++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 frontend/src/app/api/daos/[admin]/route.ts diff --git a/frontend/src/app/api/daos/[admin]/route.ts b/frontend/src/app/api/daos/[admin]/route.ts new file mode 100644 index 0000000..8c540ec --- /dev/null +++ b/frontend/src/app/api/daos/[admin]/route.ts @@ -0,0 +1,32 @@ +import { + getDao, + formatTokenAmount, + jsonResponse, + errorResponse, + STACKS_ADDRESS_RE, +} from "@/lib/openclaw-server"; + +export const dynamic = "force-dynamic"; + +// GET /api/daos/:admin — DAO info by admin address +export async function GET( + _req: Request, + { params }: { params: Promise<{ admin: string }> } +) { + try { + const { admin } = await params; + if (!STACKS_ADDRESS_RE.test(admin)) { + return jsonResponse({ error: "Invalid Stacks address" }, 400); + } + const dao = await getDao(admin); + if (!dao) { + return jsonResponse({ error: "DAO not found" }, 404); + } + return jsonResponse({ + ...dao, + totalDepositedFormatted: formatTokenAmount(dao.totalDeposited), + }); + } catch (err) { + return errorResponse(err); + } +} From bca2c9d669d3c8e79715adc11f8a029335434ed4 Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 09:59:08 +0100 Subject: [PATCH 4/8] feat(frontend): current block height API route GET /api/blocks/current proxies the Hiro /v2/info tip height, powering the widget's Block tab. --- frontend/src/app/api/blocks/current/route.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 frontend/src/app/api/blocks/current/route.ts diff --git a/frontend/src/app/api/blocks/current/route.ts b/frontend/src/app/api/blocks/current/route.ts new file mode 100644 index 0000000..9a7af5d --- /dev/null +++ b/frontend/src/app/api/blocks/current/route.ts @@ -0,0 +1,17 @@ +import { + getCurrentBlockHeight, + jsonResponse, + errorResponse, +} from "@/lib/openclaw-server"; + +export const dynamic = "force-dynamic"; + +// GET /api/blocks/current — current Stacks block height +export async function GET() { + try { + const height = await getCurrentBlockHeight(); + return jsonResponse({ blockHeight: height }); + } catch (err) { + return errorResponse(err); + } +} From 51b712e0124215a84c133852bc2a5184ab4c59c1 Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 09:59:08 +0100 Subject: [PATCH 5/8] feat(frontend): north-star stats API route GET /api/stats serves streamsCreated (the contract's get-stream-nonce), workspacesRegistered, and block height with a 60s cache per warm instance. This is the public counter behind the weekly metrics posts: stackstream.xyz/api/stats. --- frontend/src/app/api/stats/route.ts | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 frontend/src/app/api/stats/route.ts diff --git a/frontend/src/app/api/stats/route.ts b/frontend/src/app/api/stats/route.ts new file mode 100644 index 0000000..91d89ad --- /dev/null +++ b/frontend/src/app/api/stats/route.ts @@ -0,0 +1,52 @@ +import { + getStreamNonce, + getDaoCount, + getCurrentBlockHeight, + getNetwork, + jsonResponse, + errorResponse, +} from "@/lib/openclaw-server"; + +export const dynamic = "force-dynamic"; + +interface StatsSnapshot { + network: string; + blockHeight: number; + streamsCreated: number; + workspacesRegistered: number; + asOf: string; +} + +// The north-star number changes at most once per new stream, so a short cache +// keeps repeated polls from burning Hiro quota. Module state persists per warm +// serverless instance, which is enough — a cold start just refetches. +const CACHE_TTL_MS = 60_000; +let cached: { snapshot: StatsSnapshot; expires: number } | null = null; + +// GET /api/stats — protocol usage counters, all verifiable on-chain. +// streamsCreated mirrors stream-manager's get-stream-nonce (total streams ever +// opened), the project's north-star growth metric. +export async function GET() { + try { + if (cached && Date.now() < cached.expires) { + return jsonResponse(cached.snapshot); + } + const [streamsCreated, workspacesRegistered, blockHeight] = + await Promise.all([ + getStreamNonce(), + getDaoCount(), + getCurrentBlockHeight(), + ]); + const snapshot: StatsSnapshot = { + network: getNetwork(), + blockHeight, + streamsCreated, + workspacesRegistered, + asOf: new Date().toISOString(), + }; + cached = { snapshot, expires: Date.now() + CACHE_TTL_MS }; + return jsonResponse(snapshot); + } catch (err) { + return errorResponse(err); + } +} From 61853d00bc84c0382ac2f2468283a044b453c634 Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 10:35:46 +0100 Subject: [PATCH 6/8] feat(frontend): point OpenClaw widget at same-origin API OPENCLAW_API_URL now defaults to empty string (same origin), so the widget talks to this app's own route handlers with no CORS and no second deployment. The lapsed Railway URL is removed from .env.production; set NEXT_PUBLIC_OPENCLAW_API_URL only to target an external service again. --- frontend/.env.production | 3 ++- frontend/src/lib/constants.ts | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/.env.production b/frontend/.env.production index 6d7a95c..0eb026a 100644 --- a/frontend/.env.production +++ b/frontend/.env.production @@ -1,3 +1,4 @@ NEXT_PUBLIC_NETWORK=mainnet NEXT_PUBLIC_CONTRACT_DEPLOYER=SP2V6TCRFTYQHP8F4D9HSFZHRQNGVBQEZR0TMSM79 -NEXT_PUBLIC_OPENCLAW_API_URL=https://stackstream-production.up.railway.app +# OpenClaw API is served by this app's own route handlers (same origin). +# Leave unset. Only set this to point at an external service (e.g. Railway). diff --git a/frontend/src/lib/constants.ts b/frontend/src/lib/constants.ts index 15e6fdf..c153a00 100644 --- a/frontend/src/lib/constants.ts +++ b/frontend/src/lib/constants.ts @@ -19,9 +19,10 @@ export const STREAM_FACTORY_CONTRACT = `${CONTRACT_DEPLOYER}.stream-factory`; export const MOCK_TOKEN_CONTRACT = `${CONTRACT_DEPLOYER}.mock-sip010-token`; export const SIP010_TRAIT_CONTRACT = `${CONTRACT_DEPLOYER}.sip-010-trait`; -// OpenClaw API -export const OPENCLAW_API_URL = - process.env.NEXT_PUBLIC_OPENCLAW_API_URL ?? "http://localhost:3001"; +// OpenClaw API. Empty string = same origin: the API runs as Next.js route +// handlers in this app (src/app/api), so no separate backend is needed. +// Set NEXT_PUBLIC_OPENCLAW_API_URL only to point at an external service. +export const OPENCLAW_API_URL = process.env.NEXT_PUBLIC_OPENCLAW_API_URL ?? ""; // Hiro API export const HIRO_API_BASE = IS_MAINNET From 1150d22ea7ee901f9f632fadeabfdb6425e16e60 Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 10:35:46 +0100 Subject: [PATCH 7/8] docs(marketing): rewrite content schedule as a 30-day July plan Replace the June schedule (kept in git history) with a clean 30-day plan, Mon Jul 13 to Tue Aug 11, implementing the marketing review: Monday metrics posts pulled live from stackstream.xyz/api/stats with a public 40-stream target and an honest result day, a CTA link closing every public post, corrected settlement language throughout, the demo video as the Jul 15 anchor with its cuts reused across the month, and all four segments covered pending the team's focus decision. Weekly rhythm: metrics, idea, proof, objection, spotlight, human note, educate. --- grant-application/CONTENT_SCHEDULE.md | 794 ++++++++++++++++++-------- 1 file changed, 570 insertions(+), 224 deletions(-) diff --git a/grant-application/CONTENT_SCHEDULE.md b/grant-application/CONTENT_SCHEDULE.md index d5addd0..88e96e4 100644 --- a/grant-application/CONTENT_SCHEDULE.md +++ b/grant-application/CONTENT_SCHEDULE.md @@ -1,7 +1,10 @@ -# StackStream Content Schedule (June 16 to June 30) +# StackStream Content Schedule — July 2026 (Jul 13 to Aug 11, 30 days) -> Companion to `MARKETING_PLAN_V2.md`. Working draft, subject to team review and change as we build. -> One narrative per day. Each narrative is rewritten for every channel that fits it, in that channel's own voice. +> Companion to `MARKETING_PLAN_V2.md`. Working draft, subject to team review. +> One narrative per day, rewritten for every channel that fires that day, in that channel's own voice. +> The June schedule this replaces lives in git history. + +**The job of this month:** move the north-star number. Baseline was 9 streams on Jul 8; the target is 40 by Aug 7 and every day below exists to onboard someone new or keep someone we already onboarded. Persuade, prove, remove friction, repeat. --- @@ -9,415 +12,758 @@ | Channel | Who is reading | Voice | |---|---|---| -| **Official X** | The wider ecosystem and newcomers | The brand. Clear, warm, confident. We. | -| **Personal X** | Builders who follow the founder | You, the founder. I. Honest, behind the scenes, real. | +| **Official X** (@Stackstream0X) | The wider ecosystem and newcomers | The brand. Clear, warm, confident. We. | +| **Personal X** (@dev_jayteee) | Builders who follow the founder | You, the founder. I. Honest, behind the scenes, real. | | **LinkedIn** | Founders, operators, people with budgets | Professional and calm. A little longer. Value and credibility. | -| **Stacks Forum** | Stacks developers and ecosystem peers | Thoughtful, discussion-first. Honest about what is live vs roadmap. Used sparingly. | +| **Stacks Forum** | Stacks developers and ecosystem peers | Thoughtful, discussion-first. Honest about live vs roadmap. Used sparingly. | | **Grantees Telegram** | Fellow grant recipients, peers | Builder to builder. Casual, supportive, feedback-seeking. Never salesy. | | **WhatsApp (status)** | Close network, friends, early supporters | Like texting a friend. Very short. Soft. | -**Voice rules (all channels):** talk to a person, lead with the feeling or problem, one idea per post, plain words, no jargon (no escrow, protocol, SIP-010), clean punctuation, no em dashes. The line we repeat: **real-time money, settled on Bitcoin.** +--- + +## The rules every post obeys + +**Voice:** talk to a person, lead with the feeling or problem, one idea per post, plain words, no jargon (no escrow, protocol, SIP-010 in social copy), clean punctuation, no em dashes. The line we repeat: **real-time money, settled on Bitcoin.** + +**Settlement language:** never put the every-few-seconds rhythm and Bitcoin settlement in the same clause. The rhythm is how often the stream updates. Bitcoin finality comes when settlement anchors to Bitcoin, on Bitcoin's own schedule. Say "streams update in seconds; settlement inherits Bitcoin finality" for technical readers, or "your balance updates every few seconds, secured by Bitcoin" in social copy. Never say "settling on Bitcoin every few seconds" or "once it lands, it is final." -**Settlement language rule:** never put the every-few-seconds rhythm and Bitcoin settlement in the same clause. The rhythm is how often the stream updates. Bitcoin finality comes when settlement anchors to Bitcoin, on Bitcoin's own schedule. Say "streams update in seconds; settlement inherits Bitcoin finality" for technical readers, or "your balance updates every few seconds, secured by Bitcoin" in social copy. Never say "settling on Bitcoin every few seconds" or "once it lands, it is final." +**North star:** every post is judged by one question, does it give someone a reason to open a stream? Pull the live number from **stackstream.xyz/api/stats** before every metrics post. Never estimate, never round up. -**North star:** every post is judged by one question, does it give someone a reason to open a stream? The number we track is total streams created (baseline 9 on Jul 8, 2026; target 40 by Aug 7). Pull it live from `GET /api/stats` (`streamsCreated`) before every metrics post. Full definition in `MARKETING_PLAN_V2.md`. +**CTA:** every public post ends with exactly one destination, written as a full link on its own final line. Default **https://stackstream.xyz**. Use **https://t.me/dev_jaytee** when the ask is "talk to us". Forum and Grantees TG stay soft (one light link at most, never a pitch). -**CTA rule:** every public post ends with exactly one destination. Default is **stackstream.xyz**. Rotate in the 60 second demo clip or Telegram (**t.me/dev_jaytee**) when they fit the ask better. Official X is @Stackstream0X, personal X is @dev_jayteee, LinkedIn is the founder profile. Forum and Grantees Telegram stay soft ("link in the thread", "DM me"), never salesy. Full handle table in `MARKETING_PLAN_V2.md`. +**Selling points to keep warm:** 1) Settled on Bitcoin, final and irreversible once settled. 2) Real-time, balance moves every few seconds. 3) Any token on Stacks, sBTC, STX, USDA, ALEX, all of them. 4) The sender never loses control, pause, top up, cancel, reclaim. + +--- + +## The weekly rhythm + +| Slot | Format | Persuasion job | +|---|---|---| +| **Monday** | Metrics, the real number | Social proof that compounds. Nobody else posts verifiable numbers weekly. | +| **Tuesday** | Idea or feature | Teach one thing that makes streaming feel obvious. | +| **Wednesday** | Proof | Video, receipt, live clip. Seeing beats reading. | +| **Thursday** | Objection or friction killer | Answer the exact doubt that stops a signup. | +| **Friday** | Segment spotlight | One audience per week pictured using it: DAOs, freelancers, merchants, grants. | +| **Saturday** | Human note | Founder story, behind the scenes, warmth. Trust is the product. | +| **Sunday** | Educate or vision | Evergreen ideas travel on weekends. | -**Selling points to keep warm (weave in often, never let them go cold):** -1. Settled on Bitcoin. Once a payment is final, it cannot be reversed. -2. Real-time, money moves every few seconds. -3. **Every token, not just one. Full SIP-010 multi-token support.** Stream sBTC, STX, USDA, ALEX, or any token on Stacks. Pay and get paid in what you actually hold. In social copy say "any token"; with developers and in the ecosystem it is fine to say SIP-010 multi-token support. +LinkedIn fires about twice a week. Forum twice this month. Grantees TG five genuine touches. WhatsApp most days, one soft line. --- ## Which channels fire each day -| Day | Narrative | Official X | Personal X | LinkedIn | Forum | Grantees TG | WhatsApp | +| Day | Narrative | Off. X | Pers. X | LinkedIn | Forum | Grantees TG | WhatsApp | |---|---|:--:|:--:|:--:|:--:|:--:|:--:| -| Jun 16 | New chapter: pay as you go | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | -| Jun 17 | The tap, not the bucket | ✓ | ✓ | | | | ✓ | -| Jun 18 | Payday that runs itself (DAOs) | ✓ | ✓ | ✓ | | | ✓ | -| Jun 19 | Watch it work (demo) | ✓ | ✓ | | ✓ | ✓ | ✓ | -| Jun 20 | Paid as you work (freelancers) | ✓ | ✓ | | | | ✓ | -| Jun 21 | Salary is personal (privacy roadmap) | ✓ | ✓ | | | | ✓ | -| Jun 22 | Why Bitcoin | ✓ | ✓ | ✓ | ✓ | | ✓ | -| Jun 23 | Fair subscriptions (merchants) | ✓ | ✓ | ✓ | | | ✓ | -| Jun 24 | Show the receipt (proof) | ✓ | ✓ | | | ✓ | ✓ | -| Jun 25 | Fund in stages (grants) | ✓ | ✓ | ✓ | | ✓ | ✓ | -| Jun 26 | Where this goes (cross-chain roadmap) | ✓ | ✓ | ✓ | ✓ | | ✓ | -| Jun 27 | Meet a real user (spotlight) | ✓ | ✓ | | | ✓ | ✓ | -| Jun 28 | Three steps to start | ✓ | ✓ | | | | ✓ | -| Jun 29 | Where we are this week (metrics) | ✓ | ✓ | ✓ | | ✓ | ✓ | -| Jun 30 | Milestone day | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Jul 13 | Day one: the counter starts | ✓ | ✓ | | | ✓ | ✓ | +| Jul 14 | The tap, not the bucket | ✓ | ✓ | | | | ✓ | +| Jul 15 | Demo video launch | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | +| Jul 16 | Your first five minutes | ✓ | ✓ | | | | ✓ | +| Jul 17 | Payday that runs itself (DAOs) | ✓ | ✓ | ✓ | | | ✓ | +| Jul 18 | Where the money actually sits | ✓ | ✓ | | | | ✓ | +| Jul 19 | Why Bitcoin | ✓ | ✓ | | | | ✓ | +| Jul 20 | Metrics, week 2 | ✓ | ✓ | | | | ✓ | +| Jul 21 | Ask the chain (OpenClaw) | ✓ | ✓ | | | | ✓ | +| Jul 22 | Show the receipt | ✓ | ✓ | | | ✓ | ✓ | +| Jul 23 | Any token you hold | ✓ | ✓ | | | | ✓ | +| Jul 24 | Paid as you work (freelancers) | ✓ | ✓ | ✓ | | | ✓ | +| Jul 25 | Three steps, one offer | ✓ | ✓ | | | | ✓ | +| Jul 26 | Subscriptions that feel fair | ✓ | ✓ | ✓ | | | ✓ | +| Jul 27 | Metrics, week 3 | ✓ | ✓ | | | | ✓ | +| Jul 28 | Life changes, streams adjust | ✓ | ✓ | | | | ✓ | +| Jul 29 | The assistant, on camera | ✓ | ✓ | | | | ✓ | +| Jul 30 | Fund in stages (grants) | ✓ | ✓ | ✓ | | ✓ | ✓ | +| Jul 31 | Meet a streamer (spotlight) | ✓ | ✓ | | | | ✓ | +| Aug 1 | The real cost of waiting | ✓ | ✓ | | | | ✓ | +| Aug 2 | Where this goes (cross-chain) | ✓ | ✓ | | ✓ | | ✓ | +| Aug 3 | Metrics, week 4 | ✓ | ✓ | | | | ✓ | +| Aug 4 | Your salary is personal (privacy) | ✓ | ✓ | | | | ✓ | +| Aug 5 | Watch a claim, start to finish | ✓ | ✓ | | | | ✓ | +| Aug 6 | Open code, tested funds | ✓ | ✓ | ✓ | | | ✓ | +| Aug 7 | Target day: the honest result | ✓ | ✓ | | | | ✓ | +| Aug 8 | You asked, we answer | ✓ | ✓ | | | | ✓ | +| Aug 9 | The money people trust most | ✓ | ✓ | | | | ✓ | +| Aug 10 | Metrics + the month in review | ✓ | ✓ | ✓ | | ✓ | ✓ | +| Aug 11 | The open invitation | ✓ | ✓ | | | | ✓ | + +**Before Jul 13:** shoot the 60 second demo (script in local ops docs), cut the three crops plus the 10 second loop and the receipt shot, and run the 30 minute June engagement review. If the review contradicts a format below, swap the content, keep the rhythm. + +--- + +## Week 1 — Make them believe (Jul 13 to Jul 19) + +### Jul 13 (Mon) — Day one: the counter starts + +> Pull [N] from stackstream.xyz/api/stats. Baseline was 9 on Jul 8. + +**Official X** +> Today we start something most projects avoid. +> Every Monday we post our real usage number, straight from the smart contract: [N] streams opened on mainnet so far. +> Anyone can verify it, any time, at stackstream.xyz/api/stats. +> Watch it grow. Better yet, be in it. +> https://stackstream.xyz + +**Personal X** +> New habit starting today. Every Monday, our real number, no dressing up: [N] streams on mainnet. +> It comes straight from the contract's own counter, so I could not fake it if I wanted to. +> When you open a stream, you literally move this number. +> https://stackstream.xyz + +**Grantees Telegram** +> Starting weekly public metrics today, [N] streams on mainnet. Posting the real counter every Monday even when it is flat, and you all know how much courage that takes. If any of you want to test a stream between our projects this month, I will set it up personally. + +**WhatsApp (status)** +> From today: our real numbers, every Monday. [N] streams on Bitcoin so far. stackstream.xyz + +--- + +### Jul 14 (Tue) — The tap, not the bucket + +**Official X** +> Every payment you have ever received was a bucket. You waited, then someone handed it over. +> A stream is a tap. Always on, your balance rising every few seconds, and you take what you have earned whenever you like. +> Turn the tap on once and payday stops being a date. +> https://stackstream.xyz + +**Personal X** +> How I explain StackStream to my family: stop thinking in buckets, start thinking in taps. +> Money that arrives while you work, not weeks after. You scoop out what is yours anytime. +> Once you see it, you cannot unsee it. See it live. +> https://stackstream.xyz -Forum: 5 substantial threads only. Grantees group: 6 genuine touches. Both kept rare on purpose. +**WhatsApp (status)** +> Money like a tap, not a bucket. That is the whole idea. stackstream.xyz --- -## Jun 16 (Tue) — Narrative: a new chapter, we pay you as you go +### Jul 15 (Wed) — DEMO VIDEO LAUNCH + +> The anchor of the month. Pin on both X accounts. All channels fire. **Official X** -> Most apps pay you later. We pay you as you go. -> StackStream is money that moves every few seconds, secured by Bitcoin. Once a payment settles, it is final. -> No invoices. No waiting for payday. Just money that flows. -> In sBTC, STX, or any token you hold. Live on Stacks. Come see it. +> This is money arriving every 5 seconds. +> A real stream, live on mainnet. Not sped up, not a mockup, and the on-chain receipt is at the end so you can check every detail yourself. +> Watch it work, then open yours in three steps. +> https://stackstream.xyz +> (attach the 60s video) **Personal X** -> I spent months on one simple idea. Getting paid should not mean waiting. -> So we built StackStream. You open a stream, and the other person earns every few seconds. They take it whenever they want. -> It is anchored to Bitcoin, so once a payment settles, it is theirs for good. -> This is the thing I am proudest of. Let me show you. +> I have wanted to show you this properly for months. +> A real balance ticking up on its own while nobody touches anything, then the receipt on-chain for anyone to verify. +> This is what we built. 60 seconds. +> https://stackstream.xyz +> (attach the 60s video) **LinkedIn** -> A quick announcement, and the belief behind it. -> Paying people should feel like turning on a tap, not waiting for a date on a calendar. -> With StackStream, a payment becomes a steady stream. Work begins, money begins, a little every few seconds. The person earning it can take it anytime, and the sender stays in control. Every payment is anchored to Bitcoin, so once it settles, it is final. -> If your team or DAO still pays in lumps and waits, there is a calmer way to do it. (link) +> Sixty seconds that explain our product better than any deck could. +> A payment on StackStream is not a monthly event, it is a stream. Work starts, money starts. The person earning watches their balance grow in real time and claims whenever they like. The sender keeps full control throughout, and settlement inherits Bitcoin finality. +> If your team, DAO, or business still pays in lumps and waits, watch this. +> https://stackstream.xyz +> (attach the 60s video) -**Stacks Forum** — thread: "A new direction for StackStream: real-time money, settled on Bitcoin" -> Hi all, an update from the StackStream side. -> We began as a streaming payments tool, and we have sharpened what we stand for. The thing that makes us different here is Bitcoin settlement. After Nakamoto, streams update in seconds; settlement inherits Bitcoin finality. And through sBTC you can stream actual Bitcoin. -> We rebuilt the whole experience around that, value first and mechanics second. Cross-chain payout and private streams are on the roadmap, and we are designing toward them rather than promising dates. -> I would genuinely value your feedback on both the message and the product. Thank you. +**Stacks Forum** — thread: "60 second demo: a live stream accruing on mainnet" +> Recorded a short demo of a real mainnet stream for people who would rather see the accrual than read about it. Balance updates in seconds; settlement inherits Bitcoin finality. The create transaction appears in the clip so you can verify it in the explorer. Happy to answer anything about edge cases, pause, resume, cancel. Feedback genuinely welcome. +> App and demo: https://stackstream.xyz **Grantees Telegram** -> Hey everyone. Small milestone on our side today. We refreshed StackStream around one clear idea, real-time money settled on Bitcoin. If any of you pay collaborators or run bounties, I would love for you to try it and tell me what feels off. We are all in the same boat, so honest feedback means a lot. +> The demo video is out. Some of you told me the real-time feel had to be obvious in the first five seconds, so that is exactly how it opens. Honest reactions wanted: does it land? **WhatsApp (status)** -> New chapter for StackStream. Money that arrives as you work, not weeks later. Quietly proud of this one. +> Watch money arrive in real time. 60 seconds, no tricks. stackstream.xyz (clip) --- -## Jun 17 (Wed) — Narrative: the tap, not the bucket +### Jul 16 (Thu) — Your first five minutes **Official X** -> The easiest way to understand StackStream. -> Old way: you wait, then get a bucket of money on payday. -> Our way: the tap is always on. Your balance rises every few seconds. Turn it off anytime. -> That is streaming money. +> Here is your entire onboarding. +> Minute 1: connect a Stacks wallet. Minute 2: pick who you are paying, the token, the amount, the length. Minute 3: open the stream. +> Minutes 4 and 5 are you watching the balance move. No forms, no approval queue. +> https://stackstream.xyz **Personal X** -> People keep asking me what streaming money means. Here is how I explain it to my family. -> A normal payment is a bucket. You wait, then someone hands it to you. -> A stream is a tap. Your money rises a little every few seconds, and you scoop some out whenever you like. -> Once you see it, you cannot unsee it. +> The bar I set for us: if you can send a message, you can send a stream. +> Connect, choose, open. Three screens. And if you get stuck anywhere, message me and I will walk you through it myself. +> https://t.me/dev_jaytee **WhatsApp (status)** -> Money like a tap, not a bucket. Always on, filling a little every few seconds. That is the whole idea. +> Five minutes from wallet to your first live stream. Try it today: stackstream.xyz --- -## Jun 18 (Thu) — Narrative: payday that runs itself (DAOs) +### Jul 17 (Fri) — Payday that runs itself (DAOs) **Official X** -> A question for anyone who runs a DAO treasury. -> How many hours do you lose each month chasing signers just to pay contributors? -> Open one stream per person instead. They get paid as they work. Pause or stop whenever you need. -> Payday runs itself now. +> DAO treasurers: count the hours you lost to last month's payday. Signers, spreadsheets, reminders. +> Open one stream per contributor instead. They earn as they work and claim when they want. You pause, top up, or stop anytime, and unearned funds return to the treasury. +> Payday that runs itself. +> https://stackstream.xyz +> (attach the claim shot from the demo) **Personal X** -> I have watched small teams burn a whole day every month just to send payroll. Signatures, spreadsheets, reminders. -> It always felt backwards to me. -> With StackStream you open a stream once and people get paid as they work. That is it. You get your day back. +> I have watched small DAOs burn a full day every month just to pay people. It always felt backwards. +> One stream per contributor, set once, runs itself. Your treasury stays yours the whole time. +> I will personally onboard any DAO's first stream, no charge, no catch. +> https://t.me/dev_jaytee **LinkedIn** -> If you run a DAO or a distributed team, payroll probably eats more time than it should. Multiple approvals, manual transfers, the same scramble every month. -> Streaming flips it. You open one stream per contributor, they are paid continuously as they work, and you can pause or stop at any point. The treasury stays in your control the whole time, and every payment is final once it settles on Bitcoin. -> Less admin, fewer mistakes, happier contributors. (link) +> For DAO operators and distributed teams: payroll should not be a monthly project. +> Streaming flips it. One stream per contributor, opened once. People are paid continuously as they work, the treasury keeps control, and every payment settles with Bitcoin behind it. Register your DAO once and every payment is on the record for members to see. +> Less admin, fewer mistakes, happier contributors. +> https://stackstream.xyz **WhatsApp (status)** -> If you have ever done payroll for a team, you know the monthly scramble. We made it run itself. +> Payday that runs itself. If you run a team, this one is for you. stackstream.xyz --- -## Jun 19 (Fri) — Narrative: watch it work +### Jul 18 (Sat) — Where the money actually sits **Official X** -> Here is a real stream running on Stacks. -> Watch the balance tick up, second by second. The video is not sped up. That is money arriving in real time. -> Anchored to Bitcoin, so once a payment settles, it is yours for good. -> (60 second demo) +> The question everyone should ask first: while money is streaming, who holds it? +> Answer: nobody. Funds sit in an on-chain vault that neither side can raid. The recipient can only claim what they have already earned. Everything else stays the sender's, always reclaimable. +> Safety by design, not by promise. +> https://stackstream.xyz **Personal X** -> I still get a small thrill watching this. -> No edits, no speed up. Just a balance going up on its own while nobody touches anything. -> This is the moment people get it. Money that moves by itself. (clip) +> The first question my mother asked about StackStream: "but where is the money while it streams?" +> Fair question. It sits on-chain where neither side can touch what is not theirs. You can only ever claim what you earned, and I can only reclaim what you have not. +> That design is why I sleep well. +> https://stackstream.xyz -**Stacks Forum** — thread: "Short demo: a stream accruing in real time on mainnet" -> Sharing a quick clip of a live stream so people can see the real-time accrual rather than read about it. Balance updates every few seconds and is claimable at any point; settlement inherits Bitcoin finality. Happy to answer anything about how it behaves in edge cases like pause, resume, and cancel. Feedback welcome. +**WhatsApp (status)** +> While money streams, nobody holds it but the chain. That is the safest version of trust. stackstream.xyz -**Grantees Telegram** -> Dropped a short demo today. This is the part I would love your eyes on, does the real-time feel obvious to you in the first five seconds, or does it need explaining? You are exactly the kind of careful audience I trust on this. +--- + +### Jul 19 (Sun) — Why Bitcoin + +**Official X** +> We could have built this somewhere cheaper. We chose Bitcoin. +> Because when a payment is final, both sides can relax. No reversals, no waiting to see if it sticks. +> The most trusted money in the world should also be the most useful. +> https://stackstream.xyz + +**Personal X** +> People ask why I did not build on a cheaper chain. +> Because trust is the entire point of money. Streams update in seconds, and settlement inherits Bitcoin finality. I would rather build slower on the foundation everyone already trusts. +> That choice is the product. +> https://stackstream.xyz **WhatsApp (status)** -> Watch the number climb on its own. No tricks. That is money in real time. (clip) +> Built on the money people trust most. On purpose. stackstream.xyz --- -## Jun 20 (Sat) — Narrative: paid as you work (freelancers) +## Week 2 — Prove it and lower the bar (Jul 20 to Jul 26) + +### Jul 20 (Mon) — Metrics, week 2 **Official X** -> Freelancers, you already did the work. Why wait 30 days to feel the money? -> Share your address once. Watch what you earned grow live. Pull it to your wallet whenever you want. -> In Bitcoin, or any token you prefer. On your terms. +> Monday numbers. +> [N] streams on mainnet, [+X] since last week. Live counter, straight from the contract, at stackstream.xyz/api/stats. +> Every one of these is a person or team who chose to get paid in real time. Join them. +> https://stackstream.xyz **Personal X** -> I freelanced for years. The worst part was never the work. It was the waiting. Invoice sent, then silence, then chasing. -> I wanted the opposite of that. Watch your earnings grow as you work, take them whenever you like. -> That feeling is why StackStream exists. +> Week 2 of honest Mondays: [N] streams, [+X] new. +> [One true sentence about what worked or what did not this week.] +> Open a stream this week and you are in next Monday's number. +> https://stackstream.xyz **WhatsApp (status)** -> For everyone who has ever waited 30 days on an invoice. There is a better way now. +> [N] streams and counting. Real number, every Monday. stackstream.xyz --- -## Jun 21 (Sun) — Narrative: your salary is personal (privacy roadmap) +### Jul 21 (Tue) — Ask the chain (OpenClaw) **Official X** -> A quiet thought for a Sunday. -> Your salary is personal. Not everyone wants it visible to the whole internet. -> Private streams are on our roadmap, built on Bitcoin. We are taking it slowly and carefully. -> More soon. +> Meet OpenClaw, the assistant living inside StackStream. +> Type a stream ID, it answers from the chain: status, deposit, what is claimable this second. Paste an address, get every stream flowing in or out of it. +> No block explorer, no guesswork. It is in the dashboard. +> https://stackstream.xyz + +**Personal X** +> My favorite underrated feature: an assistant that reads the blockchain for you. +> Ask about any stream or address and it answers in a click, live from the chain. +> Most projects make you dig. We answer. +> https://stackstream.xyz + +**WhatsApp (status)** +> Ask a question, get the answer straight from the blockchain. stackstream.xyz + +--- + +### Jul 22 (Wed) — Show the receipt + +**Official X** +> Here is a real stream from this week, and here is its receipt. +> Open the transaction, check the sender, the recipient, the amount, the timing. Nothing to take on faith. +> We like showing our work. Start yours today. +> https://stackstream.xyz +> (include the explorer link to the transaction) + +**Personal X** +> I would rather show than tell. This week's stream, receipt and all, open for anyone to verify. +> Building in the open is slower and better. +> Check it yourself, then open your own. +> https://stackstream.xyz +> (include the explorer link to the transaction) + +**Grantees Telegram** +> Posting this week's stream receipt end to end, in case a real example helps your own build-in-public posts. And the standing offer: a test stream between our projects any time, I will set it up. + +**WhatsApp (status)** +> Real stream, real receipt, on-chain. Check it yourself. stackstream.xyz + +--- + +### Jul 23 (Thu) — Any token you hold + +**Official X** +> Some tools stream one token. We stream them all. +> sBTC, STX, USDA, ALEX, whatever your team actually holds. Pick it when you open the stream and get paid in what you actually use. +> One product, every asset on Stacks. +> https://stackstream.xyz **Personal X** -> Something I think about a lot. Open money is powerful, but a salary is a private thing. -> So private streams are on our roadmap. I do not want to rush it, because getting privacy wrong helps no one. -> Slow and careful. But it is coming. +> A quiet superpower we do not talk about enough: you are not locked into one token. +> Pay in sBTC, get paid in USDA, run a grant in STX. Whatever you and the other side actually hold. +> Your money, your choice. +> https://stackstream.xyz **WhatsApp (status)** -> Money can be open and still keep some things private. Working on that, carefully. +> Stream any token you hold, not just one. stackstream.xyz --- -## Jun 22 (Mon) — Narrative: why Bitcoin +### Jul 24 (Fri) — Paid as you work (freelancers) **Official X** -> Why build payments on Bitcoin and not somewhere cheaper or flashier? -> Because when money is final, it is final. No take-backs, no surprises. -> The most trusted money in the world should also be the most useful. That is why StackStream exists. +> Freelancers: you finished the work. Why is the money still 30 days away? +> Share your address once. Watch your earnings grow live while you work. Pull them to your wallet whenever you want, in Bitcoin or any token you prefer. +> No invoice, no chasing. +> https://stackstream.xyz **Personal X** -> People ask why I did not just build this on a cheaper chain. -> Because trust is the whole point of money. When a payment is final on Bitcoin, both sides can relax. Nobody is waiting to see if it sticks. -> I would rather build slower on the foundation everyone already trusts. +> I freelanced for years. The work was never the hard part. The waiting was. +> Invoice, silence, follow-up, 30 days. We built the exact opposite: your pay grows in real time and you take it anytime. +> Send your next client this link instead of an invoice. +> https://stackstream.xyz + +**LinkedIn** +> If you hire freelancers, here is a retention tool nobody talks about: pay them as they work. +> A streamed engagement means your contractor watches their earnings grow while they build, claims anytime, and never chases an invoice. You stay in control and can pause or stop whenever scope changes. Both sides get certainty. +> The best people choose clients who pay like this. +> https://stackstream.xyz + +**WhatsApp (status)** +> For everyone still waiting on an invoice. There is a better way. stackstream.xyz + +--- -**LinkedIn** — long post -> Most of us are used to waiting for money. Invoices, net 30, payday at the end of the month. We accept the wait because that is how it has always worked. But the wait is a choice, not a law. -> StackStream turns a payment into a steady stream. The moment work starts, money starts moving, a little every few seconds, and the person earning it can take it whenever they like. If things change, the sender can pause or stop, and whatever was not earned stays with them. It is fair to both sides. -> We built it on Stacks so every payment settles with Bitcoin behind it. Once a payment is final, that is it. No reversals, no doubt. -> If your DAO, team, or business still pays in lumps and waits, there is a calmer way. (link) +### Jul 25 (Sat) — Three steps, one offer + +**Official X** +> The whole thing in three steps. +> 1. Pick who you are paying and how much. +> 2. Open the stream. +> 3. They claim anytime, you reclaim whatever is left. +> And this month, we will set up your first stream with you, step by step. +> https://t.me/dev_jaytee -**Stacks Forum** — thread: "Why we anchored streaming payments to Bitcoin finality" -> A short note on a design choice. We could have optimised purely for cost, but for payments the property that matters most is finality. Streaming amplifies that, because money is moving continuously and both parties need to trust that what landed will stay. Building on Stacks lets every stream settle with Bitcoin behind it. Curious how others here weigh finality against cost for payment use cases. +**Personal X** +> Saturday offer, no catch: if you have been curious about streaming money, message me and I will personally walk you through your first stream this week. +> Ten minutes, your token, your terms. If it is not for you, you lose nothing. +> My DMs are open. +> https://t.me/dev_jaytee **WhatsApp (status)** -> Trust is the whole point of money. That is why we built on Bitcoin. +> Free onboarding this month. I will set up your first stream with you. Message me: t.me/dev_jaytee --- -## Jun 23 (Tue) — Narrative: fair subscriptions (merchants) +### Jul 26 (Sun) — Subscriptions that feel fair **Official X** > Subscriptions, but fair to both sides. -> Instead of charging upfront and risking a chargeback, let the payment stream in as you deliver. -> Stop early, the payment stops early. Honest by design. -> And take any token your customers actually hold, not just one. +> The payment streams in as the service is delivered. The customer stops, the payment stops. No chargebacks, no disputes, no awkward refunds. +> Honest by design. +> https://stackstream.xyz **Personal X** -> I never liked how subscriptions work. Pay upfront, then hope the thing keeps being worth it. -> Streaming makes it fair. You pay as you receive the service. Stop using it, the money stops. No fights, no chargebacks. -> Quietly, I think this is how most subscriptions will work one day. +> Charging a year upfront and hoping the customer stays happy is not a business model, it is a standoff. +> Streaming fixes the incentives. Pay while you use it, stop anytime, both sides relax. +> Quietly, I think this is how subscriptions end up working. +> https://stackstream.xyz **LinkedIn** -> A thought for anyone running a subscription or service business. -> The upfront charge creates friction on both sides. Customers worry about commitment, and you carry chargeback risk. -> Streaming changes the shape of it. The payment flows in as you deliver the service. If the customer stops, the payment stops. It is honest by design, and it tends to build more trust than a big charge on day one. (link) +> A thought for subscription and service businesses. +> The upfront charge creates friction on both sides: customers fear commitment, you carry chargeback risk. A streamed payment flows in as you deliver, and if the customer stops, it stops. It builds more trust than any refund policy, and your suppliers can be paid the very same way. +> Worth a look if you bill recurring. +> https://stackstream.xyz **WhatsApp (status)** -> Subscriptions that only charge as you actually use them. Fair to everyone. +> Subscriptions that only charge while you actually use them. Fair both ways. stackstream.xyz --- -## Jun 24 (Wed) — Narrative: show the receipt (proof) +## Week 3 — Handle doubts, widen the story (Jul 27 to Aug 2) + +### Jul 27 (Mon) — Metrics, week 3 **Official X** -> Another real stream, live today. -> Real money, a real recipient, anchored to Bitcoin. Here is the receipt so you can check it yourself. -> We like to show our work. +> Monday numbers, week 3. +> [N] streams on mainnet, [+X] this week. Verify it live at stackstream.xyz/api/stats. +> Our public target is 40 by Aug 7. We are [on track / short, and here is what we are doing about it]. +> Help decide how this post reads next week. +> https://stackstream.xyz **Personal X** -> I would rather show than tell. Here is a real stream from today, receipt and all. -> Anyone can open it and verify it. No screenshots to trust, no claims to take on faith. -> Building in the open keeps me honest. +> [N] streams, [+X] this week. Three straight weeks of posting the truth. +> The target I set publicly is 40 by Aug 7. [Honest one-liner about the gap or the momentum.] +> Every stream counts, including yours. +> https://stackstream.xyz -**Grantees Telegram** -> Posting today's stream receipt in case it is useful to see a real one end to end. If you want to run a test stream between us as builders, I am happy to set one up so you can feel it from both sides. +**WhatsApp (status)** +> Week 3: [N] streams. The counter does not lie. stackstream.xyz + +--- + +### Jul 28 (Tue) — Life changes, streams adjust + +**Official X** +> Plans change. Budgets change. People change. +> That is why every stream can be paused, topped up, or cancelled in one click, and whatever was not yet earned goes straight back to the sender. +> Commitment without the trap. +> https://stackstream.xyz + +**Personal X** +> The feature I insisted on from day one: the exit. +> Pause when a project stalls. Top up when it extends. Cancel and the unearned part comes home instantly. +> Nobody should need a lawyer to stop paying for something. +> https://stackstream.xyz + +**WhatsApp (status)** +> Pause, top up, or stop anytime. Money with an undo button. stackstream.xyz + +--- + +### Jul 29 (Wed) — The assistant, on camera + +**Official X** +> Watch our assistant answer from the blockchain in real time. +> A stream ID goes in, live on-chain data comes out: status, deposit, claimable right now. +> This is what "do not trust, verify" looks like when it is friendly. +> https://stackstream.xyz +> (attach the OpenClaw screen clip) + +**Personal X** +> Party trick I never get tired of: asking OpenClaw about a stream and watching it read the chain back in a second. +> No explorer tabs, no raw calls, just answers. +> It is sitting in the dashboard waiting for you. +> https://stackstream.xyz +> (attach the OpenClaw screen clip) **WhatsApp (status)** -> Real stream, real receipt, settled on Bitcoin. Check it yourself. +> Our assistant reads the blockchain so you do not have to. stackstream.xyz --- -## Jun 25 (Thu) — Narrative: fund in stages (grants) +### Jul 30 (Thu) — Fund in stages (grants) **Official X** -> If you fund builders, here is a kinder way to do it. -> Stream the grant in stages instead of one big lump. If milestones slip, the part you have not released is still yours. -> We fund ourselves this way. It just feels right. +> If you fund builders, stream the grant instead of wiring a lump. +> Money flows as the work ships. Milestones slip, you pause. Whatever is not yet earned stays yours the entire time. +> We fund our own work exactly this way. +> https://stackstream.xyz **Personal X** -> Grants are tricky. Pay it all upfront and you carry the risk. Pay it all at the end and the builder carries it. -> Streaming sits in the middle. The grant flows as the work happens, and the unreleased part stays safe. -> We run StackStream on this ourselves, which is the best endorsement I can give it. +> Grants force a bad choice: pay upfront and carry all the risk, or pay at the end and make the builder carry it. +> Streaming sits in the middle. The grant flows with the work and the unreleased part stays safe. +> We run StackStream's own funding like this, which is the best endorsement I can give. +> https://stackstream.xyz **LinkedIn** -> For anyone who runs a grant or funding program. -> Lump sum funding forces a hard choice. Pay upfront and carry the risk, or pay at the end and push the risk onto the builder. -> Streaming softens it. Funds flow in stages as work happens, and anything not yet released stays with you. It keeps everyone aligned and removes a lot of awkward conversations. We use this approach internally, which is the strongest thing I can say about it. (link) +> For grant and funding programs: lump sums put all the risk on one side of the table. +> A streamed grant flows in stages as work happens. Anything unreleased stays with the funder, milestones slipping means pausing rather than awkward clawback conversations, and the builder still gets paid continuously while shipping. We use this for our own funding. +> How it works, in sixty seconds. +> https://stackstream.xyz **Grantees Telegram** -> This one is for us specifically. Imagine funding sub-grants or bounties as a stream, so the money flows with the work and the rest stays safe until milestones are hit. If any of you want to try it for a real bounty, I will help you set it up and we can learn from it together. +> This one is literally about us. If any project here wants to run a sub-grant or bounty as a stream, money flowing with the work and the rest staying safe, I will help you set it up and we can compare notes after. First one this week gets my full attention. **WhatsApp (status)** -> Funding builders in stages, as the work happens. The fair version of a grant. +> Fund builders in stages, as the work happens. The fair version of a grant. stackstream.xyz --- -## Jun 26 (Fri) — Narrative: where this goes (cross-chain roadmap) +### Jul 31 (Fri) — Meet a streamer (spotlight) + +> Only with the user's permission, tag them. If nobody is ready, run the story version: "picture a five person team that pays as it builds", and make converting a real spotlight the outreach goal of the week. **Official X** -> A glimpse of where this goes. -> One day you will stream on Bitcoin, and the person you pay receives it on whatever chain they call home. -> We are building toward that through sBTC bridges. Not live yet. But we are getting ready. +> Meet one of the teams streaming with us. +> No more month-end scramble. Their people watch their pay grow as they build, and the treasury stays in control the whole time. +> This is exactly who we built StackStream for. Be next. +> https://stackstream.xyz **Personal X** -> Dreaming a little out loud today. -> I want you to stream from Bitcoin and have the other person receive it wherever they already are, no friction. -> That is not live yet, and I will not pretend it is. But we are building so we are ready the moment it can be done well. +> Someone chose us for payroll this month. Seeing a team trust your product with something as personal as pay is a quiet, huge feeling. +> Thank you. We will keep earning it. +> If you want to be the next story here, my DMs are open. +> https://t.me/dev_jaytee -**LinkedIn** -> A note on where we are headed, and an honest line about timing. -> Today StackStream streams real-time money settled on Bitcoin. That is live. What is next is reach, letting a payment that starts on Bitcoin land for the recipient on the chain they already use, through sBTC bridges. -> That part is roadmap, not released. I would rather tell you the truth about timing than oversell it. We are building so we are ready when it is ready. (link) +**WhatsApp (status)** +> Real teams are streaming pay with us now. Come see why. stackstream.xyz + +--- + +### Aug 1 (Sat) — The real cost of waiting + +**Official X** +> Net 30 is not a payment term. It is a free loan you never agreed to give. +> Thirty days of your money sitting in someone else's account, every single invoice, forever. +> Streaming ends the loan. You earn it, you have it. +> https://stackstream.xyz + +**Personal X** +> Did the math once on my freelance years: every net 30 invoice was me lending my client a month of my salary, interest free. +> Nobody calls it that, but that is what it is. +> I built the alternative. +> https://stackstream.xyz + +**WhatsApp (status)** +> Net 30 is a free loan you never agreed to give. Stop giving it. stackstream.xyz + +--- + +### Aug 2 (Sun) — Where this goes (cross-chain roadmap) + +**Official X** +> A glimpse of where this goes. +> One day you stream on Bitcoin, and the person you pay receives it on whatever chain they call home. We are building toward that through sBTC bridges. +> Not live yet, and we will not pretend otherwise. But we are getting ready. +> https://stackstream.xyz + +**Personal X** +> Dreaming out loud on a Sunday: stream from Bitcoin, get paid wherever you already live, no friction. +> Not live yet, and I will always tell you the truth about timing. But every design choice we make today keeps that door open. +> Follow the build. +> https://stackstream.xyz **Stacks Forum** — thread: "Designing StackStream to be bridge ready" -> A roadmap note for the builders here. We are keeping our payment flows composable so that once sBTC cross-chain transfer is generally available, streaming payout to other ecosystems is a natural extension rather than a rewrite. Token transfer first, not arbitrary messaging, so we are scoping accordingly. Interested in how others are thinking about cross-chain payout patterns from Stacks. +> A roadmap note for the builders here. We keep our payment flows composable so that once sBTC cross-chain transfer is generally available, streaming payout to other ecosystems is an extension rather than a rewrite. Token transfer first, not arbitrary messaging, and we are scoping accordingly. Curious how others think about cross-chain payout patterns from Stacks. +> Project: https://stackstream.xyz **WhatsApp (status)** -> Stream on Bitcoin, get paid wherever you live. Not yet, but we are building for it. +> Stream on Bitcoin, get paid wherever you live. Not yet, but we are building for it. stackstream.xyz --- -## Jun 27 (Sat) — Narrative: meet a real user (spotlight) +## Week 4 — Close the month, cement the habit (Aug 3 to Aug 11) -> Only post with the team's permission and tag them. If no team is ready, swap for a short story, "imagine a five person DAO that pays as it builds." +### Aug 3 (Mon) — Metrics, week 4 **Official X** -> Meet one of the first teams streaming with us. -> No more month-end scramble. Their people get paid as they build, and the treasury stays in control. -> This is exactly who we made StackStream for. Welcome. +> Monday numbers, four weeks running. +> [N] streams on mainnet, [+X] this week, live at stackstream.xyz/api/stats. +> Four Mondays of verifiable truth. That is the whole marketing strategy. +> https://stackstream.xyz **Personal X** -> Today made it real for me. A team I admire is now paying their people through StackStream. -> Seeing someone choose your thing for something as important as payroll is a quiet, huge feeling. -> Thank you for trusting us. We will earn it. - -**Grantees Telegram** -> Happy to share that a team is now streaming payroll with us. Felt right to tell this group first, since you have been part of the journey. If you want an intro to how they set it up, say the word. +> [N] streams, [+X] new. A month ago posting real numbers weekly felt risky. Now it feels like the only honest way to build. +> Target day is Thursday. [One line on where we stand.] +> There is still time to be in the final count. +> https://stackstream.xyz **WhatsApp (status)** -> First real team paying their people through StackStream today. Big quiet smile. +> Four Mondays of real numbers: [N] streams. Target day is Thursday. stackstream.xyz --- -## Jun 28 (Sun) — Narrative: three steps to start +### Aug 4 (Tue) — Your salary is personal (privacy roadmap) **Official X** -> Want to try it? Three steps. -> 1. Pick who you are paying and how much. -> 2. Open the stream. -> 3. They claim anytime. You reclaim whatever is left. -> That is the whole thing. We will help if you get stuck. +> A quiet thought. +> Your salary is personal. Not everyone wants it visible to the whole internet. +> Private streams are on our roadmap, built carefully on Bitcoin. We are taking it slowly because getting privacy wrong helps nobody. +> The rest is live today. +> https://stackstream.xyz **Personal X** -> The thing I am happiest about is how little there is to learn. -> Pick who and how much. Open the stream. They claim whenever. You get back anything unused. -> No manual, no jargon. If you can send a message, you can send a stream. +> Something I think about a lot: open money is powerful, but a salary is a private thing. +> So private streams are on our roadmap. Slow and careful, because privacy done wrong is worse than no privacy. +> It is coming. Meanwhile, everything else works today. +> https://stackstream.xyz **WhatsApp (status)** -> Three steps. Pick, open, done. They get paid in real time. Try it this week? +> Money can be open and still keep some things private. We are working on that. stackstream.xyz --- -## Jun 29 (Mon) — Narrative: where we are this week (metrics) +### Aug 5 (Wed) — Watch a claim, start to finish -> Fill the brackets with real numbers before posting. If numbers are thin, lead with stories instead. +**Official X** +> From "I earned it" to "it is in my wallet" in one clip. +> Watch a recipient claim mid-stream: click, confirm, done. The stream keeps flowing behind them. +> No payday, no permission, no waiting. +> https://stackstream.xyz +> (attach the claim clip) + +**Personal X** +> The moment that converts people is never the pitch. It is watching someone claim their pay mid-week just because they felt like it. +> Click, confirm, money in wallet, stream still running. +> That freedom is the product. +> https://stackstream.xyz +> (attach the claim clip) + +**WhatsApp (status)** +> Claim your pay any moment you like. Watch how fast: stackstream.xyz + +--- + +### Aug 6 (Thu) — Open code, tested funds **Official X** -> A look at where we are this week. -> [X] streams live. [Y] settled on Bitcoin. [Z] teams trying it. -> Small, real numbers, growing every day. Thank you to everyone streaming with us. We are just getting started. +> Where your money flows should never be a mystery. +> Our contracts are open source, covered by a test suite that checks funds are always conserved, and hardened by independent security review. +> Read the code, run the tests, then stream with confidence. +> https://stackstream.xyz **Personal X** -> Sharing the real numbers, small as they are. -> [X] streams, [Y] settled, [Z] teams. I would rather show honest early numbers than pretend we are bigger than we are. -> Every one of these is a real person who gave us a chance. Thank you. +> We put our contracts through independent security review and a test suite that verifies every satoshi is conserved. Then we left it all public. +> Not because it is required. Because pay is too important for "trust me". +> The code is open. +> https://github.com/jayteemoney/stackstream **LinkedIn** -> A short progress update. -> This week StackStream reached [X] live streams, [Y] settled on Bitcoin, across [Z] teams. Early numbers, shared honestly. -> What I am learning is that the message that lands is not the technology, it is the feeling of being paid as you work. We will keep building around that. Thank you to everyone who is trying it. (link) +> A note on how we treat trust. +> StackStream's smart contracts are open source, independently reviewed, and covered by tests that verify funds are conserved in every scenario, pause, cancel, top up, claim. Anyone can read the code and re-run the checks. +> When software moves salaries, this should be table stakes. +> https://stackstream.xyz -**Grantees Telegram** -> Weekly honesty post. We are at [X] streams and [Z] teams. Not huge yet, but real. If you have been meaning to test it, this week would genuinely help us learn, and I will support you the whole way. +**WhatsApp (status)** +> Open code, independent review, tested funds. Pay deserves nothing less. stackstream.xyz + +--- + +### Aug 7 (Fri) — Target day: the honest result + +> Whatever the number says, post it. Hitting builds momentum, missing builds trust. Both are worth having. + +**Official X** +> Thirty days ago we set a public target: 40 streams by today. +> The result: [N]. [If hit: "Target met, and every single one is verifiable on-chain." If missed: "Short of the target, and we said we would report honestly, so here it is. What we learned: ..."] +> The counter never stops, and the next target drops Monday. +> https://stackstream.xyz + +**Personal X** +> Result day. We aimed for 40 streams in 30 days and landed at [N]. +> [Two honest sentences: what worked, what did not, what changes.] +> Building in public means posting this either way. Thank you to everyone in the count. +> https://stackstream.xyz **WhatsApp (status)** -> Small real numbers this week, growing every day. Thank you to everyone who jumped in. +> Thirty days ago we set a public target. Today: the honest result. [N] streams. stackstream.xyz --- -## Jun 30 (Tue) — Narrative: milestone day +### Aug 8 (Sat) — You asked, we answer **Official X** -> Today is a milestone for us. -> StackStream is real-time money, settled on Bitcoin, and it is live for anyone to use. -> Any token, any team, any reason to pay someone. Come open your first stream. We will set it up with you, step by step. +> Real questions from this month, answered. +> Is my money safe mid-stream? It sits on-chain where neither side can take what is not theirs. +> Which tokens? Any token on Stacks. +> Can I stop? Anytime, and the unearned part returns instantly. +> More answers on the site. +> https://stackstream.xyz **Personal X** -> Milestone day. I am a little emotional, honestly. -> We set out to make getting paid feel instant and fair, settled on the money people trust most. It is live, and it works. -> If you have followed along, thank you. If you are new, come open your first stream with me. +> Spent the month collecting every question people asked me about StackStream. Put the honest answers in one place, the FAQ on our site. +> The question behind every question was the same: "can I trust it?" The answer we give is: do not trust it, verify it. +> Ask me anything, anytime. +> https://t.me/dev_jaytee -**LinkedIn** -> Today marks a milestone for StackStream. -> We set out to make payments feel like a tap rather than a wait, and to settle them on Bitcoin so they are final. That is live now, for anyone who pays people, for work, grants, or services. -> Thank you to everyone who tested, gave feedback, and believed early. If you would like a walkthrough for your team, I am happy to help personally. (link) +**WhatsApp (status)** +> Every question you have about streaming money, answered honestly: stackstream.xyz + +--- -**Stacks Forum** — thread: "StackStream milestone: real-time money settled on Bitcoin, live for everyone" -> A thank you to this community. Your feedback shaped where we landed. StackStream is live as real-time streaming payments settled on Bitcoin, with cross-chain payout and private streams on the roadmap. If you build on Stacks and want to stream payments to contributors or grantees, I would love to help you set it up and hear what we should improve next. +### Aug 9 (Sun) — The money people trust most + +**Official X** +> Fifteen years, no bailouts, no rollbacks, no downtime that mattered. +> That is the settlement layer under every StackStream payment. +> When pay is on the line, build on the money people trust most. +> https://stackstream.xyz + +**Personal X** +> Sunday conviction post: fads rotate, Bitcoin settles. +> We anchored a payments product to it on purpose, because salaries deserve the most boring, most trusted foundation that exists. +> Boring foundations, exciting product. +> https://stackstream.xyz + +**WhatsApp (status)** +> Built on the most trusted money there is. On purpose. stackstream.xyz + +--- + +### Aug 10 (Mon) — Metrics + the month in review + +**Official X** +> Five Mondays of real numbers. Here is the month: +> [N] total streams, up from 9. [Y] claimed without a single dispute. The demo passed [V] views. +> Every number verifiable, every week, at stackstream.xyz/api/stats. +> August target: [new target]. Hold us to it. +> https://stackstream.xyz + +**Personal X** +> One month of radical honesty, in numbers: 9 streams to [N]. A demo video, a public target, and a result posted either way. +> The biggest lesson: people join what they can verify. +> New month, new target, same honesty. +> https://stackstream.xyz + +**LinkedIn** +> A month ago we committed to one metric and weekly public reporting. The result: [N] streams on mainnet, up from 9, every one verifiable against the contract itself. +> The lesson for anyone building in fintech: the most persuasive marketing asset we own is a number we cannot fake. +> The counter is public. +> https://stackstream.xyz **Grantees Telegram** -> We made it to our milestone, and you have been part of it from the start. If any grantee here wants to stream a bounty or a contributor payment this week, I will personally help you set it up. Let us put real Bitcoin streams between our projects. +> Month one of public metrics done: 9 to [N] streams, target [hit/missed] and reported honestly either way. Happy to share what worked with anyone here thinking of doing the same. And the test-stream offer never expires. **WhatsApp (status)** -> Milestone day for StackStream. It is live, and I could not be prouder. Come open your first stream with me. +> One month, five honest Mondays, [N] streams. Thank you for watching us build. stackstream.xyz --- -## July schedule (next) +### Aug 11 (Tue) — The open invitation -The June run above shipped without CTAs on most X posts; that is fixed by the CTA rule at the top, which applies to everything from here on. The July schedule gets drafted after two inputs land: -1. The 30 minute engagement review of June's posts, so July is built around the top 2 or 3 formats that actually performed. -2. The team's decision on segment focus (whether to concentrate outreach on Stacks-native DAOs first). +**Official X** +> If you made it through a month of our posts, you have seen it all: live demos, on-chain receipts, honest numbers, real teams. +> The only thing missing is your stream. +> Open it in five minutes, or let us set it up with you personally. +> https://stackstream.xyz + +**Personal X** +> Closing the month the way I started it: with an open door. +> If anything this month made you curious, message me. I will set up your first stream with you, walk you through every step, and you keep full control the entire time. +> That is the offer, no catch. +> https://t.me/dev_jaytee -Two assets July will lean on either way: the 60 second demo video (shot-by-shot script kept in the local ops docs) and the weekly Monday metrics post powered by the live `streamsCreated` number. +**WhatsApp (status)** +> A month of showing our work. Now it is your turn. Open your first stream: stackstream.xyz --- ## Notes before posting -- Brackets ([X], [Y], [Z], the spotlight team) need real values. If a DAO or demo streams are not ready by Jun 24, 27, or 29, tell me and I will rework those days so nothing rings hollow. -- Personal X and Official X go out the same day but never with identical words. Personal is "I", Official is "we". -- Forum and Grantees group are for substance and feedback, not announcements. Keep them rare and genuine. -- WhatsApp is a status line, not a broadcast blast. Keep it to one warm sentence. +- Brackets [N], [+X], [Y], [V] get real values on the morning of posting, from stackstream.xyz/api/stats and the platforms' own analytics. Never estimate, never round up. If a number is embarrassing, post it anyway, that is the strategy. +- Every public post ends with its CTA link on the final line. On X the bare link auto-embeds; if the preview card crowds a video post, keep the link and drop the media annotation, never the other way around. +- Personal X and Official X fire the same day but never with identical words. Personal is "I", Official is "we". +- Forum and Grantees TG are for substance and feedback, not announcements. Keep them rare and genuine. +- WhatsApp is one warm status line, not a broadcast blast. +- If the June engagement review or the team's DAO-focus decision contradicts anything here, the rhythm stays, the content flexes. Fridays re-weight toward DAOs the moment the team approves. +- The demo assets (60s cut, 10s loop, claim shot, receipt shot) come from one recording. Shoot it before Jul 13, script in the local ops docs. From 28b1a45e270dfec75e6fdcf34f4298ea54c52ca0 Mon Sep 17 00:00:00 2001 From: jayteemoney Date: Thu, 9 Jul 2026 10:35:46 +0100 Subject: [PATCH 8/8] chore: keep outreach messages out of the repo OUTREACH_MESSAGES_JUL2026.md joins the other local-only operational docs in .gitignore. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d495100..15511dc 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ grant-application/DOMAIN_SETUP.md grant-application/TESTER_GUIDE.md grant-application/TEAM_UPDATE_EMAIL.md grant-application/DEMO_VIDEO_SCRIPT.md +grant-application/OUTREACH_MESSAGES_JUL2026.md