${heading}
`, + `${discovery}
`, 'diff --git a/community-token/public/llms.txt b/community-token/public/llms.txt new file mode 100644 index 0000000..e34c0b1 --- /dev/null +++ b/community-token/public/llms.txt @@ -0,0 +1,45 @@ +# Feel Your Protocol — Community Token + +> A transparency page for the FYP community token on Base. It explains, in good faith, how the +> token relates to Feel Your Protocol (an open-source Ethereum protocol exploration project), +> how creator fees are used to fund open-source work, and — just as clearly — what the token +> is not. It is not an investment offer, a security, or project equity. + +The token (FYP) was launched independently by community members on Bankr, a platform for +deploying tokens on Base. The maintainer (Holger Drewes, @HolgerD77) did not issue it but +engages with it in good faith and documents the handling here. A portion of trading fees +(creator fees) accrues to a claimable balance, which is used to fund time on Feel Your +Protocol explorations and related EthereumJS upkeep. Participation is through on-chain +activity in support of public-good Ethereum tooling — not ownership of the code, a roadmap, +or any promise of returns. + +## Page sections + +- [How it works](https://community-token.feelyourprotocol.org/#intro): Plain-language intro to the token, creator fees, and the relationship to FYP +- [Which token](https://community-token.feelyourprotocol.org/#token-info): On-chain identity — name, symbol (FYP), network (Base), and contract address +- [Developer Fund](https://community-token.feelyourprotocol.org/#fund): How claimed fees are intended to be used (development at 50 €/h, LLM/API costs, infrastructure, conferences) +- [Treasury](https://community-token.feelyourprotocol.org/#treasury): Live snapshot of claims, withdrawals, and a work log; full books on GitHub +- [Guidelines](https://community-token.feelyourprotocol.org/#guidelines): Scope, token relationship, terms, and community — what helps and what does not + +## Key facts + +- Token: Feel Your Protocol (symbol FYP), deployed on Base via Bankr. +- Relationship: related to, but not the same as, the Feel Your Protocol project. +- Not a financial product, security, or equity; holding/trading grants no ownership, voting + rights, or claims on the code or repositories. +- Creator fees fund open-source work; token price and volume do not set the work or the hours. +- All accounting (claims, withdrawals, hours, expenses) is tracked openly in the `treasury/` + folder of the GitHub repository. + +## Related + +- [Main site](https://feelyourprotocol.org/): The interactive Ethereum protocol explorations this funds +- [Documentation](https://docs.feelyourprotocol.org/index.html): Architecture and contributor guide +- [Treasury ledgers on GitHub](https://github.com/feelyourprotocol/website/tree/main/treasury): Open books backing the Treasury section + +## Notes + +- This page is the reference for how the token is handled; it is documentation, not financial + advice or an investment pitch, and carries no liability for market risk from holding the token. +- Experimental, open-source project; direction may change, pause, or wind down. If it winds + down, anything unspent is intended for a charity or public-good cause. diff --git a/docs/contributing/adding-an-exploration.md b/docs/contributing/adding-an-exploration.md index 0689308..b1ba006 100644 --- a/docs/contributing/adding-an-exploration.md +++ b/docs/contributing/adding-an-exploration.md @@ -40,6 +40,8 @@ export const INFO: Exploration = { id: 'eip-XXXX', path: '/eip-XXXX-short-description', title: 'Human-Readable Title', + seoDescription: + 'Interactive Ethereum explainer for EIP-XXXX — plain-language summary with key search terms and what the widget demonstrates.', infoURL: 'https://eips.ethereum.org/EIPS/eip-XXXX', topic: 'scaling', timeline: 'fusaka', @@ -59,6 +61,7 @@ export const INFO: Exploration = { | `id` | Yes | Unique identifier, matches the folder name | | `path` | Yes | URL path for the exploration page | | `title` | Yes | Display title | +| `seoDescription` | Recommended | Plain-text discovery copy (~120–160 chars) for search engines and static prerender. See [Discovery & SEO](#discovery--seo) below. | | `infoURL` | Yes | Link to the specification or reference material | | `topic` | Yes | Topic ID this exploration belongs to. Must be one of the fixed set: `scaling`, `privacy`, `ux`, `security`, `robustness`, `interoperability`. Topics are static and not added via contributions — see [Architecture](/guide/architecture#topics) for the full list. | | `timeline` | Yes | Timeline ID for this exploration (e.g. `fusaka`, `glamsterdam`, `ready`, `research`, `ideas`). See [Architecture](/guide/architecture) for details. | @@ -70,6 +73,41 @@ export const INFO: Exploration = { | `creatorURL` | No | URL to the creator's profile (X/Twitter, GitHub, etc.) | | `poweredBy` | Yes | Array of `{ name, href }` for library credits | +## Discovery & SEO + +Feel Your Protocol targets people who heard about an Ethereum protocol change and want to **understand how it behaves** — not generic “what is Ethereum” queries. Discovery copy should match how they search: EIP numbers, acronyms, mechanism names, and “interactive explainer” intent. + +### `seoDescription` + +Add one plain-text sentence in `info.ts` (~120–160 characters, no HTML). It powers the page meta description, JSON-LD, and the static prerender paragraph crawlers see before JavaScript runs. + +**Write for discovery, not the widget UI.** Keep `introText` as the pedagogical question on the page; use `seoDescription` for search-friendly terms. + +Good example (EIP-8024): + +``` +Interactive EVM explainer for EIP-8024 DUPN, SWAPN, and EXCHANGE stack opcodes — step through deep stack access in an Amsterdam-fork EVM in your browser. +``` + +Include where natural: + +- **EIP/ERC number** and plain-language name +- **Synonyms and acronyms** people search for (BAL, PeerDAS, ModExp, secp256r1) +- **“Interactive”** or **“explainer”** — FYP’s differentiator + +If omitted, a generic fallback is generated from the title; prefer writing `seoDescription` explicitly. + +### Other fields that help discovery + +| Field | Role | +| ----- | ---- | +| `path` | Keyword-rich slug (`/eip-8024-stack-opcodes-dupn-swapn-exchange`) | +| `title` | EIP number plus human-readable terms | +| `tags` | Reusable concepts (EVM, BAL, PeerDAS) for future category pages | +| `infoURL` | Canonical spec link (used in structured data) | + +Topic pages use their `introText` with an “Ethereum {topic}” document title — explorations inherit topic context via breadcrumbs. + ## Step 3: Create `examples.ts` Define example presets that users can select from a dropdown: diff --git a/docs/public/llms.txt b/docs/public/llms.txt new file mode 100644 index 0000000..2bcd574 --- /dev/null +++ b/docs/public/llms.txt @@ -0,0 +1,44 @@ +# Feel Your Protocol — Documentation + +> Contributor and architecture documentation for Feel Your Protocol, an open-source project +> of interactive, hands-on explorations of Ethereum protocol changes. These docs explain how +> the project is structured, how to add a new exploration, and how the reusable building +> blocks (E-Components) and UI components fit together. + +Feel Your Protocol turns Ethereum protocol changes (EIPs, ERCs, research) into interactive +widgets that run real Ethereum library code in the browser. Each exploration is a +self-contained folder with metadata (`info.ts`) and an interactive widget. The docs are aimed +at contributors and developers who want to understand or extend the project. + +## Guide + +- [Getting Started](https://docs.feelyourprotocol.org/guide/getting-started.html): What the project is, prerequisites, local setup, and quality checks +- [Architecture](https://docs.feelyourprotocol.org/guide/architecture.html): Folder-per-exploration model, taxonomies (Topics, Timeline, Tags), and lazy-loaded widgets +- [Changelog](https://docs.feelyourprotocol.org/changelog.html): History of the structural base (contribution model, components, project structure) + +## Contributing + +- [How to Contribute](https://docs.feelyourprotocol.org/contributing/how-to-contribute.html): Ways to help; adding an exploration is the most impactful +- [AI-Assisted Development](https://docs.feelyourprotocol.org/contributing/ai-assisted-development.html): Using AI tools to build explorations, and what to double-check +- [Adding an Exploration](https://docs.feelyourprotocol.org/contributing/adding-an-exploration.html): Step-by-step from `info.ts` metadata to interactive widget and tests +- [Images](https://docs.feelyourprotocol.org/contributing/images.html): Cover images and the color system +- [UI Components](https://docs.feelyourprotocol.org/contributing/ui-components.html): Shared UI primitives (e.g. ResultBoxUIC, example selectors) +- [E-Components](https://docs.feelyourprotocol.org/contributing/e-components.html): The reusable Ethereum building-block model +- [Available E-Components](https://docs.feelyourprotocol.org/contributing/available-e-components.html): Catalog of ready-to-use E-Components and their APIs +- [Styling & Design](https://docs.feelyourprotocol.org/contributing/styling.html): The exploration design system and class conventions +- [Code Conventions](https://docs.feelyourprotocol.org/contributing/code-conventions.html): Coding standards and test commands +- [Third-Party Libraries](https://docs.feelyourprotocol.org/contributing/third-party-libraries.html): How new library dependencies are evaluated and added + +## Related + +- [Main site](https://feelyourprotocol.org/): The live, interactive explorations +- [Community Token](https://community-token.feelyourprotocol.org/): How a community token on Base supports this open-source work +- [Source on GitHub](https://github.com/feelyourprotocol/website): Full source for site, docs, and explorations + +## Notes + +- Built with VitePress; pages are static HTML and the Markdown sources live in the `docs/` + folder of the GitHub repository. +- The project is in beta: APIs of reusable components are still evolving. Latest docs always + apply — there is no version switching. +- Educational, open-source software provided as-is; not affiliated with the Ethereum Foundation. diff --git a/public/llms.txt b/public/llms.txt new file mode 100644 index 0000000..2bbf782 --- /dev/null +++ b/public/llms.txt @@ -0,0 +1,52 @@ +# Feel Your Protocol + +> Feel Your Protocol is a collaborative, open-source project offering interactive, hands-on +> explorations of upcoming Ethereum protocol changes. Each exploration runs real EVM and +> cryptography library code directly in the browser — no backend, no mocks — so you can feel +> how an EIP, ERC, or piece of protocol research actually behaves with real inputs. + +The goal is understanding through interaction: instead of only reading a specification, you +change inputs and watch real Ethereum libraries (notably EthereumJS) produce real results. +Explorations are organized through three taxonomies — Topics (strategic pillars like Scaling +or UX), Timeline (maturity / hardfork placement like Fusaka or Research), and Tags (reusable +technical concepts like EVM or Precompiles). + +The project is built and maintained by Holger Drewes (@HolgerD77) and is open to community +contributions. It is educational and non-commercial in character. + +## Site + +- [Home](https://feelyourprotocol.org/): Latest explorations, topics, timeline, and tags +- [All explorations](https://feelyourprotocol.org/all): Full list, filterable by topic, timeline, and tag +- [Imprint](https://feelyourprotocol.org/imprint): Contact and legal information + +## Explorations + +- [EIP-7928 — Block-Level Access Lists](https://feelyourprotocol.org/eip-7928-block-level-access-lists) +- [EIP-8024 — Stack Opcodes (DUPN / SWAPN / EXCHANGE)](https://feelyourprotocol.org/eip-8024-stack-opcodes-dupn-swapn-exchange) +- [EIP-7883 — ModExp Gas Cost Increase](https://feelyourprotocol.org/eip-7883-modexp-gas-cost-increase) +- [EIP-7594 — PeerDAS Data Availability Sampling](https://feelyourprotocol.org/eip-7594-peerdas-data-availability-sampling) +- [EIP-7951 — secp256r1 Precompile](https://feelyourprotocol.org/eip-7951-secp256r1-precompile) + +## Topics + +- [Scaling](https://feelyourprotocol.org/scaling) +- [Privacy](https://feelyourprotocol.org/privacy) +- [UX](https://feelyourprotocol.org/ux) +- [Security](https://feelyourprotocol.org/security) +- [Robustness](https://feelyourprotocol.org/robustness) +- [Interoperability](https://feelyourprotocol.org/interoperability) + +## Related + +- [Documentation](https://docs.feelyourprotocol.org/index.html): Architecture, contributor guide, and reusable E-Components +- [Community Token](https://community-token.feelyourprotocol.org/): How a community token on Base supports this open-source work, in good faith +- [Source on GitHub](https://github.com/feelyourprotocol/website): Full source, each exploration is a self-contained folder + +## Notes + +- Built with Vue 3 + Vite. Interactive widgets run client-side, so the full behavior of an + exploration appears after JavaScript executes; the page intro text summarizes each one. +- Powered in large part by EthereumJS (https://github.com/ethereumjs/ethereumjs-monorepo). +- This is experimental, educational software provided as-is. It is not financial advice and + not affiliated with the Ethereum Foundation. diff --git a/src/explorations/REGISTRY.ts b/src/explorations/REGISTRY.ts index bd72c03..ca9aa3a 100644 --- a/src/explorations/REGISTRY.ts +++ b/src/explorations/REGISTRY.ts @@ -38,6 +38,8 @@ export interface Exploration { imageBoxHeight?: string /** When set, exploration content may Teleport into `#exploration-right-panel`. */ rightPanel?: boolean + /** Plain-text discovery copy for meta tags and static prerender (~120–160 chars). See contributing guide. */ + seoDescription?: string introText: string usageText: string creatorName?: string diff --git a/src/explorations/eip-7594/info.ts b/src/explorations/eip-7594/info.ts index c41ee88..2310416 100644 --- a/src/explorations/eip-7594/info.ts +++ b/src/explorations/eip-7594/info.ts @@ -7,6 +7,8 @@ export const INFO: Exploration = { id: 'eip-7594', path: '/eip-7594-peerdas-data-availability-sampling', title: 'EIP-7594 Peer Data Availability Sampling', + seoDescription: + 'Interactive PeerDAS explainer for EIP-7594 — Ethereum data availability sampling with real cryptography in your browser.', infoURL: 'https://eips.ethereum.org/EIPS/eip-7594', topic: 'scaling', timeline: 'fusaka', diff --git a/src/explorations/eip-7883/info.ts b/src/explorations/eip-7883/info.ts index c52f320..515e389 100644 --- a/src/explorations/eip-7883/info.ts +++ b/src/explorations/eip-7883/info.ts @@ -7,6 +7,8 @@ export const INFO: Exploration = { id: 'eip-7883', path: '/eip-7883-modexp-gas-cost-increase', title: 'EIP-7883 ModExp Gas Cost Increase', + seoDescription: + 'EIP-7883 ModExp gas cost increase — interactive look at Ethereum precompile gas recalibration and its security motivation.', infoURL: 'https://eips.ethereum.org/EIPS/eip-7883', topic: 'robustness', timeline: 'fusaka', diff --git a/src/explorations/eip-7928/info.ts b/src/explorations/eip-7928/info.ts index d189d01..17cad01 100644 --- a/src/explorations/eip-7928/info.ts +++ b/src/explorations/eip-7928/info.ts @@ -7,6 +7,8 @@ export const INFO: Exploration = { id: 'eip-7928', path: '/eip-7928-block-level-access-lists', title: 'EIP-7928 Block Level Access Lists', + seoDescription: + 'Explore Ethereum block-level access lists (BAL) with EIP-7928 — interactive walkthrough of block access patterns and blockAccessListHash.', infoURL: 'https://eips.ethereum.org/EIPS/eip-7928', topic: 'scaling', timeline: 'glamsterdam', diff --git a/src/explorations/eip-7951/info.ts b/src/explorations/eip-7951/info.ts index f99ec93..a0b4d97 100644 --- a/src/explorations/eip-7951/info.ts +++ b/src/explorations/eip-7951/info.ts @@ -7,6 +7,8 @@ export const INFO: Exploration = { id: 'eip-7951', path: '/eip-7951-secp256r1-precompile', title: 'EIP-7951 secp256r1 Precompile Support', + seoDescription: + 'EIP-7951 secp256r1 precompile — try passkey-friendly signature verification on Ethereum with an interactive precompile demo.', infoURL: 'https://eips.ethereum.org/EIPS/eip-7951', topic: 'ux', timeline: 'fusaka', diff --git a/src/explorations/eip-8024/info.ts b/src/explorations/eip-8024/info.ts index b7a8ae5..c5c0850 100644 --- a/src/explorations/eip-8024/info.ts +++ b/src/explorations/eip-8024/info.ts @@ -7,6 +7,8 @@ export const INFO: Exploration = { id: 'eip-8024', path: '/eip-8024-stack-opcodes-dupn-swapn-exchange', title: 'EIP-8024 DUPN, SWAPN & EXCHANGE Stack Opcodes', + seoDescription: + 'Interactive EVM explainer for EIP-8024 DUPN, SWAPN, and EXCHANGE stack opcodes — step through deep stack access in an Amsterdam-fork EVM in your browser.', infoURL: 'https://eips.ethereum.org/EIPS/eip-8024', topic: 'robustness', timeline: 'glamsterdam', diff --git a/src/libs/__tests__/pageSeo.spec.ts b/src/libs/__tests__/pageSeo.spec.ts index 1eb36a3..a397806 100644 --- a/src/libs/__tests__/pageSeo.spec.ts +++ b/src/libs/__tests__/pageSeo.spec.ts @@ -10,6 +10,7 @@ import { generateRobotsTxt, generateSitemapXml, getBreadcrumbsForPath, + getExplorationDiscoveryDescription, getPageSeoForPath, getPageSeoForRoute, getSitemapPaths, @@ -49,11 +50,12 @@ describe('pageSeo', () => { expect(sitemapPaths.length).toBeLessThan(getValidSpaPaths().length) }) - it('builds exploration page meta with EIP-specific title and description', () => { - const exploration = Object.values(EXPLORATIONS)[0]! + it('builds exploration page meta with seoDescription and EIP-specific title', () => { + const exploration = EXPLORATIONS['eip-8024']! const seo = getPageSeoForPath(exploration.path) expect(seo.title).toContain(exploration.title) + expect(seo.description).toBe(exploration.seoDescription) expect(seo.description.length).toBeGreaterThan(20) expect(seo.canonicalUrl).toBe(`${SITE_ORIGIN}${exploration.path}`) expect(seo.imageUrl).toBe(`${SITE_ORIGIN}${DEFAULT_OG_IMAGE_PATH}`) @@ -62,6 +64,22 @@ describe('pageSeo', () => { expect(JSON.stringify(seo.jsonLd)).toContain(exploration.infoURL) }) + it('falls back to generated discovery copy when seoDescription is omitted', () => { + const exploration = { ...EXPLORATIONS['eip-8024']!, seoDescription: undefined } + const description = getExplorationDiscoveryDescription('eip-8024', exploration) + + expect(description).toContain('EIP-8024') + expect(description).toContain('Interactive Ethereum explainer') + }) + + it('uses Ethereum-prefixed topic titles and discovery descriptions', () => { + const seo = getPageSeoForPath('/scaling') + + expect(seo.title).toBe('Ethereum Scaling — Feel Your Protocol') + expect(seo.description).toContain('Interactive Ethereum scaling explorations') + expect(seo.description).toContain('Throughput and cost efficiency') + }) + it('marks filtered list views as noindex with a clean canonical URL', () => { const seo = getPageSeoForRoute('/all', { tag: 'EVM' }) @@ -110,6 +128,26 @@ describe('pageSeo', () => { expect(html).toContain('application/ld+json') }) + it('preserves viewport and charset when replacing description meta', () => { + const html = injectSeoIntoHtml( + [ + '
', + '', + '', + '', + '', + '${discovery}
`, '