feat(platform): Explore Publishing — metadata-repo sync, listings API, and frontend#57
Conversation
Design metadata-repo-based appchain registry with CI auto-validation, Platform DB sync, and Desktop Messenger public toggle integration.
…PI transition (Steps 6-8) Step 6 — DB & Sync: - Add explore_listings table to schema.sql (synced from metadata repo) - Create db/listings.js with upsertListing, getListings, deletion detection - Create lib/metadata-sync.js — GitHub Git Trees API polling (5-min interval) - Wire metadata-sync into server.js startup Step 7 — API transition: - Remove FK constraints from social tables (support both deployment and listing IDs) - Update store.js GET /appchains to merge listings + deployments - Update store.js GET /appchains/:id to check listings first - Update requireAppchain middleware to check both tables - Update requireOwner to use signed_by as fallback Step 8 — L1 Indexer integration: - Update l1-indexer to enrich both listings and deployments from IPFS metadata - Collect proposer addresses from both tables for event polling
…tep 9) - Add STACK_LABELS constant for stack type display names - Add stack_type and l1_chain_id filter params to storeApi.appchains() - Explore list page: add Stack Type and L1 Network filter dropdowns - Card: show stack badge, native token symbol, operator name - Detail page: add listing-specific fields to AppchainDetail interface - Detail page: show stack type badge, native token, operator info section - Detail page: build L1 contracts list from l1_contracts JSON (listings) or legacy fields - Detail page: MetaMask "Add to Wallet" uses listing native token symbol/decimals - Detail page: owner check includes signed_by fallback for listings - Detail page: add bridge_url link in services section
…ity fixes Code reuse: - Extract resolveAppchain() helper in store.js (removes 3x duplication) - Fix RPC proxy to use requireAppchain (was 404ing listing-only appchains) - Detail endpoint uses requireAppchain middleware (removes double lookup) - Extract ServiceLink component + displayUrl/isSafeUrl helpers (removes 3x JSX duplication) Efficiency: - SHA-based skip in metadata-sync: compare blob SHA, skip unchanged files - Concurrent blob fetching with bounded concurrency (5 at a time) - Add getListingByIdentityContract() for O(1) index lookup (replaces loading 1000 rows) - Add getListingAddressesForChain() for L1 indexer (returns only addresses, not full rows) - Remove wasted getListingById() call after upsert (caller never uses return value) Quality: - Fix pagination: offset applied after merge, not per-source - Fix case-insensitive hex in parseFilePath regex - upsertListingWithSha stores blob SHA for change detection
- Remove dead upsertListingWithSha, merge SHA into upsertListing atomically - Replace O(N) getActiveDeployments scan with getDeploymentByProposer index lookup - Extract shared Appchain/AppchainDetail types to lib/types.ts - Add getAppchainChainId helper to eliminate duplicate derivation - Fix syncOnce comment numbering (duplicate step 4 → 5) - Add unit tests: listings (24), metadata-sync parseFilePath (9), deployments (3)
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Pull request overview
This PR introduces substantial Desktop App (Tauri + React) and local-server (Node/Express + SQLite) infrastructure, alongside core Rust/L2 configuration changes (native token config, mempool tx filtering) and multiple CI workflow adjustments (skip-ci gating, disabling perf workflows, adding caches).
Changes:
- Add Desktop App UI scaffolding, docs, build/dev scripts, and a build workflow.
- Implement/extend local-server APIs (deployments/hosts/fs/keychain/open-url), DB schema/helpers, and remote docker tooling.
- Extend core Rust types/config (native token fields + scaling, batch helper, fee token tx rejection), plus Docker build improvements.
Reviewed changes
Copilot reviewed 19 out of 19 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| crates/desktop-app/ui/index.html | Adds Vite/React HTML entrypoint for desktop UI |
| crates/desktop-app/ui/eslint.config.js | Adds ESLint flat config for TS/React |
| crates/desktop-app/ui/docs/control-interface-analysis.md | Adds design/analysis doc for control interface |
| crates/desktop-app/ui/docs/chat-feature-test-plan.md | Adds chat feature test plan doc |
| crates/desktop-app/ui/README.md | Adds desktop UI architecture + dev docs |
| crates/desktop-app/ui/.gitignore | Adds UI gitignore defaults |
| crates/desktop-app/local-server/tests/e2e-chain-id.js | Adds E2E script for chain ID flows |
| crates/desktop-app/local-server/test-e2e-fork.js | Adds E2E Sepolia fork deployment script |
| crates/desktop-app/local-server/server.js | Adds Express server: routes, store proxy, open-url, recovery, static UI |
| crates/desktop-app/local-server/routes/keychain.js | Adds API route to list keys + derive address |
| crates/desktop-app/local-server/routes/hosts.js | Adds CRUD + connection-test endpoints for remote hosts |
| crates/desktop-app/local-server/routes/fs.js | Adds filesystem browse endpoint |
| crates/desktop-app/local-server/package.json | Adds local-server package manifest + deps |
| crates/desktop-app/local-server/lib/tools-config.js | Adds helpers to compute tools ports/URLs from deployment row |
| crates/desktop-app/local-server/lib/rpc-client.js | Adds JSON-RPC helper for monitoring/health checks |
| crates/desktop-app/local-server/lib/keychain.js | Adds macOS Keychain integration wrapper via security CLI |
| crates/desktop-app/local-server/lib/etherscan-verify.js | Adds Etherscan v2 verification helper module |
| crates/desktop-app/local-server/lib/docker-remote.js | Adds SSH-based remote docker deploy + tools start |
| crates/desktop-app/local-server/docs/tools-isolation-analysis.md | Adds analysis doc for multi-deployment tools isolation |
| crates/desktop-app/local-server/docs/remote-and-ai-deploy-plan.md | Adds remote + AI deploy plan doc |
| crates/desktop-app/local-server/docs/key-management-dev-plan.md | Adds key-management implementation plan doc |
| crates/desktop-app/local-server/docs/external-access-plan.md | Adds external-access design doc |
| crates/desktop-app/local-server/db/schema.sql | Adds SQLite schema for deployments/hosts/events |
| crates/desktop-app/local-server/db/hosts.js | Adds DB helpers for hosts table |
| crates/desktop-app/local-server/db/deployments.js | Adds deployments CRUD + port/chain-id allocators + event log helpers |
| crates/desktop-app/local-server/db/db.js | Adds SQLite initialization + migrations |
| crates/desktop-app/docs/unified-l2-state-design.md | Adds unified L2 state design doc |
| crates/desktop-app/docs/tokamak-ai-credit-design.md | Adds AI credit system design doc |
| crates/desktop-app/docs/deployment-optimization-plan.md | Adds deployment optimization plan doc |
| crates/desktop-app/dev.sh | Adds dev script to run local-server + tauri dev |
| crates/desktop-app/BUILD.md | Adds desktop app build guide (+ CI example) |
| crates/common/types/l2/batch.rs | Adds Batch::is_empty_batch() + unit tests |
| crates/common/types/genesis.rs | Adds native token config fields + helpers + unit tests |
| crates/common/rkyv_utils.rs | Adds Option<U256> rkyv wrapper |
| crates/blockchain/error.rs | Adds mempool error for FeeToken tx not supported |
| crates/blockchain/blockchain.rs | Rejects FeeToken tx type (0x7d) in mempool path |
| cmd/ethrex/l2/options.rs | Adds guest program id option + prover programs-config option wiring |
| cmd/ethrex/l2/command.rs | Passes native token scale factor into rollup processing call |
| cmd/ethrex/initializers.rs | Refactors store engine selection + adds env-based dev block time |
| cmd/ethrex/build_l2.rs | Adds GuestProgramRegistry contract compilation/bytecode generation |
| cmd/ethrex/build.rs | Avoids requiring .git in Docker by using env fallback for vergen |
| Dockerfile.sp1 | Adds SP1-enabled build image + guest program artifacts |
| Dockerfile | Removes .git copy and adds vergen env fallback |
| Cargo.toml | Excludes desktop-app Tauri crate from workspace and adds toml dep |
| .github/workflows/pr_upgradeability.yaml | Adds skip-ci gating |
| .github/workflows/pr_perf_levm.yaml | Disables PR trigger, adds skip-ci gating |
| .github/workflows/pr_perf_changelog.yml | Disables PR trigger, adds skip-ci gating |
| .github/workflows/pr_perf_build_block_bench.yml | Adds skip-ci gating |
| .github/workflows/pr_perf_blocks_exec.yaml | Disables PR trigger, adds skip-ci gating |
| .github/workflows/pr_loc.yaml | Disables PR trigger, adds fork + skip-ci gating |
| .github/workflows/pr_lint_readme.yaml | Adds skip-ci gating |
| .github/workflows/pr_lint_license.yaml | Adds skip-ci gating |
| .github/workflows/pr_lint_gha.yaml | Adds skip-ci gating |
| .github/workflows/pr_github_status_l1.yaml | Disables PR triggers, adds skip-ci gating |
| .github/workflows/pr_github_metadata.yaml | Adds skip-ci gating |
| .github/workflows/pr_fixture_tests.yml | Adds new fixture offline tests workflow + skip-ci gating |
| .github/workflows/pr_check_l2_genesis.yml | Adds skip-ci gating |
| .github/workflows/pr-main_mdbook.yml | Removes PR trigger; extends lychee excludes/timeouts |
| .github/workflows/pr-main_levm.yaml | Adds skip-ci gating |
| .github/workflows/pr-main_l2_tdx_build.yaml | Disables PR trigger; adds skip-ci gating |
| .github/workflows/pr-main_l2_prover.yaml | Adds skip-ci gating |
| .github/workflows/pr-main_l2.yaml | Adds caches; disables some matrices; renames services; loosens end-check logic |
| .github/workflows/pr-main_l1_l2_dev.yaml | Adds skip-ci gating |
| .github/workflows/pr-main_l1.yaml | Adds skip-ci gating |
| .github/workflows/main_prover.yaml | Adds skip-ci gating for PR events |
| .github/workflows/build-desktop.yml | Adds desktop build workflow for tagged releases |
| .github/scripts/check-hive-results.sh | Expands known flaky hive tests |
| .dockerignore | Excludes .git/ to reduce build context |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
Summary of ChangesHello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request introduces the 'Explore Publishing' feature, enabling seamless integration and display of appchain metadata from a dedicated repository onto the platform's Explore page. It encompasses significant backend and frontend development, including new database structures, a robust metadata synchronization service, and optimized API endpoints, all designed to enhance the discoverability and presentation of appchain information. Highlights
Changelog
Ignored Files
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Code Review
This pull request introduces a major new feature for publishing appchains to the Explore page by syncing with a central metadata repository. The implementation is comprehensive, covering database schema changes, a new backend sync service, API updates to merge new and legacy data sources, and corresponding frontend enhancements. The code quality is high, with good practices like bounded concurrency in the sync process, performance optimizations in the L1 indexer, and the addition of unit tests. I've identified a couple of areas for potential improvement related to maintainability and performance scaling, but overall this is an excellent and well-executed feature.
…ntainability - CORS: restrict origin to Tauri dev/prod allowlist (Copilot #1) - open-url: use execFile with arg arrays instead of shell exec (Copilot #2) - fs browse: restrict path traversal to home directory (Copilot #3) - test-e2e-fork: move RPC URL to SEPOLIA_RPC_URL env var (Copilot #4) - docker-remote: clear timeout on stream close, close stream on timeout (Copilot #5) - docker-remote: add shell quoting (q()) and assertSafeName for all interpolated shell args to prevent injection (Copilot #6-8) - genesis.rs: add ChainConfig::validate() for pre-startup checks (Copilot #9) - listings.js: use named params (@id, @name, ...) instead of 30 positional ? args for upsertListing (Gemini #1)
da3f0c8
into
feat/app-customized-framework
Summary
Implements the Explore Publishing pipeline: appchain operators register metadata in
tokamak-rollup-metadata-repository, and the Platform automatically syncs and displays them on the Explore page.explore_listingstable (30 columns) for metadata-repo synced appchain dataresolveAppchain()pattern — check listings first, fallback to legacy deployments; merged pagination; stack/chain filtersgetListingByIdentityContract,getDeploymentByProposer) instead of full-table scansServiceLinkcomponent extractionAppchain/AppchainDetailinterfaces inlib/types.tswithgetAppchainChainId()helperCommits
8de38a5— Analysis and development plan591f460— DB schema, metadata-sync, API transition (Steps 6-8)740dda6— Explore frontend updates (Step 9)a17afe6— Simplify review Phase 1: SP1 profiling baseline and ZK optimization plan #1 fixes80547d5— Simplify review feat(tokamak): JIT-compiled EVM with proven execution infrastructure #2 fixes + unit testsTest plan
npm testpasses (34/34 unit tests)next buildsucceeds with no type errors