Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
497 commits
Select commit Hold shift + click to select a range
fd84f19
Merge pull request #171 from ethpandaops/refactor/contributoor-metric…
mattevans Oct 24, 2025
0defd53
refactor(DetailPage): redesign contributor detail layout for clarity
mattevans Oct 24, 2025
8a12c11
Merge pull request #172 from ethpandaops/rm/box-in-box
mattevans Oct 24, 2025
9669274
feat(MultiLineChart): extend SERIES_COLORS palette to 10 distinct colors
mattevans Oct 26, 2025
617c98c
feat: improve contributor detail page UX and data handling
mattevans Oct 26, 2025
26aa030
Merge pull request #174 from ethpandaops/refactor/cleanup-contribtoors
mattevans Oct 26, 2025
cdedb63
feat(api): add fct_attestation_liveness_by_entity_head endpoints and …
mattevans Oct 27, 2025
ac1313c
Merge pull request #175 from ethpandaops/regen/liveness-cbt-types
mattevans Oct 27, 2025
59006bc
feat(live): add slot progress timeline component
samcm Oct 27, 2025
918cacb
Merge remote-tracking branch 'origin/release/frontend' into feat/slot…
samcm Oct 27, 2025
d663626
Delete src/components/Ethereum/SlotProgressTimeline/PHASE_DEFINITIONS.md
samcm Oct 27, 2025
eececab
Delete src/components/Ethereum/SlotProgressTimeline/README.md
samcm Oct 27, 2025
6005129
Merge pull request #176 from ethpandaops/feat/slot-progress-component
samcm Oct 27, 2025
8b443b7
feat: add missed attestations by entity chart to slot details
samcm Oct 27, 2025
c812892
Merge pull request #177 from ethpandaops/samcm/missed-attestations-chart
samcm Oct 27, 2025
42f8db7
feat(api): add fct_attestation_observation_by_node endpoints and types
mattevans Oct 27, 2025
3c2fd92
feat(MultiLineChart): add collapsible series filter with search for >…
mattevans Oct 27, 2025
5e6fb3b
perf(MultiLineChart): memoize filter helpers to prevent needless reco…
mattevans Oct 27, 2025
c210ddc
refactor(MultiLineChart): change let to const for updated Set to prev…
mattevans Oct 27, 2025
c7da793
Merge pull request #178 from ethpandaops/refactor/contributoor-attest…
mattevans Oct 27, 2025
62f68ee
feat(ethereum): implement Ethereum epochs index and detail pages
samcm Oct 27, 2025
6ea726a
Remove verbose subtitle from epoch detail page header
samcm Oct 27, 2025
7fbd8bd
Merge release/frontend into samcm/epochs-section
samcm Oct 27, 2025
a8712bc
fix: resolve lint issues
samcm Oct 27, 2025
6a6da69
refactor(theme): migrate color system to CSS-first architecture
Savid Oct 27, 2025
29c1b1b
Merge pull request #180 from ethpandaops/samcm/epochs-section
samcm Oct 27, 2025
0e02b5d
feat(SlotPlayerControls): add elapsed timer showing seconds since slo…
mattevans Oct 28, 2025
9e998d5
Merge pull request #181 from ethpandaops/feat/add-slot-countdown
mattevans Oct 28, 2025
6568fa1
fix(epochs): fill missing epochs in offline validators chart
samcm Oct 28, 2025
f6f24fa
Merge pull request #182 from ethpandaops/samcm/fill-offline-epochs
samcm Oct 28, 2025
39e4788
feat(SlotBasicInfoCard): add block seen indicator (#184)
samcm Oct 28, 2025
1874e77
fix: show all 32 slots in epoch detail view (#183)
samcm Oct 28, 2025
6f32ddf
merge master
Savid Oct 28, 2025
73a34b6
fix colors
Savid Oct 28, 2025
8d48864
Merge pull request #173 from ethpandaops/feat/theme
Savid Oct 28, 2025
7ef1ff9
feat: upgrade to Vitest v4
Savid Oct 28, 2025
40abb70
fix: TypeScript errors in dataVizColors test
Savid Oct 28, 2025
ee35b30
feat(DataAvailabilityHeatmap): add core chart component for PeerDAS
samcm Oct 28, 2025
911c181
refactor(DataAvailabilityHeatmap): improve layout and column visibility
samcm Oct 28, 2025
dc12f07
Merge pull request #188 from ethpandaops/feat/upgrade-vitest-v4
Savid Oct 28, 2025
70efaa9
chore: cleanup chart tests and migrate to ECharts v6 APIs
Savid Oct 28, 2025
4373370
Merge pull request #189 from ethpandaops/chore/cleanup-tests-charts
Savid Oct 28, 2025
eb85444
feat: add visualize-data skill for chart guidance (#190)
samcm Oct 29, 2025
bfe52d2
feat(ethereum): Add Entities list and deep dive page (#185)
samcm Oct 29, 2025
d5f6435
feat(PopoutCard): add modal-only content props (#192)
samcm Oct 29, 2025
4e5a454
fix(epochs): correct offline attesters logic and improve table stylin…
samcm Oct 29, 2025
28c33d9
feat: Add ESLint rules to enforce theme color usage (#191)
samcm Oct 29, 2025
7e9b396
feat: das custody
mattevans Oct 29, 2025
3e9d43b
style: add explicit void return types to event handlers for clarity
mattevans Oct 29, 2025
2a103bc
fix(IndexPage.tsx): cast next_page_token to string | undefined to res…
mattevans Oct 29, 2025
53bf5eb
feat: move DAS Custody page from /xatu to /ethereum/data-availability
mattevans Oct 29, 2025
d7a6e3e
feat(DataAvailabilityHeatmap): add granularity-aware response time la…
mattevans Oct 29, 2025
0969857
fix(openapi-ts.config.ts): update default OpenAPI spec URL to new pro…
mattevans Oct 30, 2025
761ee56
feat(api): add slot_start_date_time field to FctDataColumnAvailabilit…
mattevans Oct 30, 2025
d300fef
refactor: replace ad-hoc collapsible panels with reusable Disclosure …
mattevans Oct 30, 2025
a3f4fee
style(RangeInput): add custom styling for range input track and thumb
mattevans Oct 30, 2025
6751c66
refactor: replace generic DataAvailabilityHeatmap with page-specific …
mattevans Oct 30, 2025
ae81bb7
feat(GridHeatmap.stories.tsx): add DataAvailabilityStyle story with a…
mattevans Oct 30, 2025
cd52d33
chore(storybook): exclude Interactive story from vitest runs
mattevans Oct 30, 2025
2b05369
Merge pull request #194 from ethpandaops/feat/das-custody
mattevans Oct 30, 2025
b5e447a
Merge branch 'release/frontend' into samcm/da-heatmap
mattevans Oct 30, 2025
f46dceb
perf(eslint): optimize linting performance
Savid Oct 30, 2025
e2b1391
Merge pull request #199 from ethpandaops/optimize/eslint-performance
Savid Oct 30, 2025
5b6992f
Merge pull request #187 from ethpandaops/samcm/da-heatmap
mattevans Oct 30, 2025
b8d99d5
refactor(theme): refine terracotta and aurora colors for all themes (…
samcm Oct 30, 2025
e4f282c
chore(api): regenerate client after removing test data-type endpoints
mattevans Oct 30, 2025
e2c0e70
Merge pull request #201 from ethpandaops/feat/regen-again
mattevans Oct 30, 2025
c56d18a
feat: add DataAvailabilitySkeleton component for DAS Custody page
mattevans Oct 30, 2025
3a369c6
Merge pull request #202 from ethpandaops/da/loading-skele
mattevans Oct 30, 2025
cae3db9
chore: update dependencies
Savid Oct 30, 2025
0d5c9a2
Merge pull request #203 from ethpandaops/chore/packages-update
Savid Oct 30, 2025
edd9937
feat: Use URL params for network selection (#195)
samcm Oct 30, 2025
6924355
feat: improve mobile sidebar UX with animations and optimizations
Savid Oct 30, 2025
276688f
fix: improve mobile responsiveness for ConfigGate component
Savid Oct 30, 2025
1d11eaf
Merge release/frontend into feat/mobile-sidebar-improvements
Savid Oct 30, 2025
80adf9f
Merge pull request #205 from ethpandaops/fix/mobile-configgate-respon…
Savid Oct 30, 2025
27fe546
Merge pull request #204 from ethpandaops/feat/mobile-sidebar-improvem…
Savid Oct 30, 2025
9e55498
feat: add network-based feature gating system
mattevans Oct 30, 2025
38e941f
Merge branch 'release/frontend' into feat/features
mattevans Oct 30, 2025
1e98a5f
refactor(FeatureGate): replace fixed overlay with centered page layout
mattevans Oct 30, 2025
362743f
fix: correct typo in experiments image paths from "expirements" to "e…
mattevans Oct 30, 2025
628c5be
feat(FeatureGate): show list of networks where feature is enabled
mattevans Oct 30, 2025
66d61ff
Merge pull request #206 from ethpandaops/feat/features
mattevans Oct 30, 2025
f8b313c
fix: resolve p5.js animation lifecycle issues with React 19 Strict Mode
Savid Oct 30, 2025
b4b2a43
Merge branch 'release/frontend' into fix/p5js-react-strict-mode-cleanup
Savid Oct 30, 2025
2d38f49
Merge pull request #208 from ethpandaops/fix/p5js-react-strict-mode-c…
Savid Oct 30, 2025
88615d3
feat: add open-graph and twitter meta tags for SEO and social sharing
mattevans Oct 30, 2025
efb19b7
Merge pull request #211 from ethpandaops/feat/meta-seo
mattevans Oct 30, 2025
36d974f
refactor: rename experiments array to features in mock config
mattevans Oct 30, 2025
7a1b4b0
Merge pull request #212 from ethpandaops/feat/sb-404
mattevans Oct 30, 2025
5315123
feat(meta): add complete open-graph and twitter card tags to all routes
mattevans Oct 30, 2025
1f53800
fix: replace hard-coded lab.ethpandaops.io URLs with VITE_BASE_URL en…
mattevans Oct 30, 2025
99c6809
Merge pull request #213 from ethpandaops/moar/seo-tweaks
mattevans Oct 30, 2025
f287309
feat(routes): add comprehensive SEO meta tags to all routes
mattevans Oct 30, 2025
08cab1f
style: remove parentheses around single parameter arrow functions
mattevans Oct 30, 2025
43c8c4e
Merge pull request #214 from ethpandaops/moar/seo-tweaks-pt2
mattevans Oct 30, 2025
738d728
machine-code(live slots): What is codex cooking brother (#179)
samcm Oct 31, 2025
dcf73b1
feat: add Conductor integration with setup and run scripts
samcm Oct 31, 2025
b468851
fix(homepage): tighten mobile vertical spacing (#215)
samcm Oct 31, 2025
868dd0e
fix: improve conductor run script port detection and logging (#216)
samcm Oct 31, 2025
1b82461
feat(api): add fct_block_data_column_sidecar_first_seen_by_node endpo…
mattevans Oct 31, 2025
7f89ae1
Merge pull request #217 from ethpandaops/chore/regen-types-dc-sidecar…
mattevans Oct 31, 2025
326fea9
Add ethPandaOps logo in multiple formats (#218)
samcm Oct 31, 2025
68b5c4c
feat: add Notification component for toast-style notifications (#219)
samcm Oct 31, 2025
408d407
feat(contributors): add Fusaka-aware data column latency chart
mattevans Oct 31, 2025
96b7463
Merge pull request #220 from ethpandaops/feat/contributoors-sidecar
mattevans Oct 31, 2025
851f9be
feat(DataColumnLatencyChart): add version check and upgrade prompt fo…
mattevans Oct 31, 2025
4e43bce
test: add comprehensive unit tests for version utility functions
mattevans Oct 31, 2025
42a8a24
style(DataColumnLatencyChart): remove redundant word "data" and "your"
mattevans Oct 31, 2025
82ac0ea
Merge pull request #221 from ethpandaops/feat/contributoors-sidecar
mattevans Oct 31, 2025
05d5985
feat: add clown emoji for Apple Watch screens (#222)
samcm Oct 31, 2025
f261589
feat(ethereum): add relative slot display and improve chart UX (#196)
samcm Oct 31, 2025
ccf8727
feat(das-custody): migrate drill-down state from local useState to UR…
mattevans Oct 31, 2025
621c1a9
Merge pull request #224 from ethpandaops/feat/das-map-deep-linking
mattevans Oct 31, 2025
5809237
feat: add timezone toggle for UTC/local display in data availability …
mattevans Oct 31, 2025
3e259fd
docs(TimezoneToggle.stories.tsx): add interactive live date examples …
mattevans Oct 31, 2025
3a6b2cd
Merge pull request #227 from ethpandaops/feat/tz-provider
mattevans Oct 31, 2025
1c8cc0e
feat(chart-download): implement chart download with logo and metadata…
samcm Oct 31, 2025
496f21c
feat: add reusable redirect handler for legacy routes (#226)
samcm Oct 31, 2025
91660ac
fix(MultiLine): resolve React Hooks ESLint warnings
Savid Oct 31, 2025
bfac004
style: add explicit JSX.Element return types to storybook examples
mattevans Oct 31, 2025
2827eb9
Merge branch 'release/frontend' into fix/multiline-chart-lint-warnings
Savid Oct 31, 2025
b831eaa
fix(TimezoneToggle): add missing return type annotations
Savid Oct 31, 2025
8b066f6
Merge pull request #229 from ethpandaops/chore/rework-date
mattevans Oct 31, 2025
0cdad0f
cleanup
Savid Oct 31, 2025
04b6e97
Merge pull request #230 from ethpandaops/fix/multiline-chart-lint-war…
Savid Oct 31, 2025
8a3ee10
feat(live): responsive mobile layout for /ethereum/live (#223)
samcm Oct 31, 2025
2547dba
feat: redesign epoch overview with unified header and p5js visualizat…
samcm Oct 31, 2025
8d24502
feat(scroll): enable automatic scroll-to-top on navigation (#237)
samcm Oct 31, 2025
9c077db
refactor: audit and simplify chart components per ECharts 6.0 best pr…
samcm Oct 31, 2025
ed79f22
feat: add reusable CopyToClipboard component with toast notifications…
samcm Oct 31, 2025
0c816a8
feat: add reusable Timestamp component with tabbed modal (#234)
samcm Oct 31, 2025
398667b
feat(formatting): standardize slot and epoch number display (#233)
samcm Oct 31, 2025
accf8ff
feat(Navigation): add automatic breadcrumb navigation (#235)
samcm Oct 31, 2025
e63b5bd
fix(layout): resolve mobile viewport scrolling issue with fixed header
Savid Oct 31, 2025
31e1028
feat(Sidebar): close sidebar when network search param changes
Savid Oct 31, 2025
6bc2b76
Merge pull request #238 from ethpandaops/fix/mobile-header-scroll-issue
Savid Oct 31, 2025
74823e1
fix: add type cast for network search param access
Savid Oct 31, 2025
6cc08ce
feat(epochs): add block arrival times statistical band chart (#228)
samcm Oct 31, 2025
612eab2
Merge pull request #239 from ethpandaops/feat/sidebar-close-on-networ…
Savid Oct 31, 2025
cb8628f
fix: downgrade html-to-image to 1.11.11 to fix Firefox font bug
Savid Oct 31, 2025
6fc9863
fix lock
Savid Oct 31, 2025
4e1fbac
Merge pull request #240 from ethpandaops/fix/html-to-image-firefox-fo…
Savid Oct 31, 2025
ae8b22c
tweaks claude
Savid Oct 31, 2025
0bb6b9c
add donut chart
Savid Oct 31, 2025
d1797f8
lint
Savid Oct 31, 2025
6508b7e
feat(Disclosure): add panelClassName prop to allow custom panel styling
mattevans Oct 31, 2025
54ea484
Merge pull request #243 from ethpandaops/fix/card-inception
mattevans Oct 31, 2025
a5b19dc
refactor(GeographicalMapView): replace MapChart with ECharts world map
mattevans Oct 31, 2025
d4a2225
Merge pull request #244 from ethpandaops/feat/geo-checklist-lick-of-p…
mattevans Oct 31, 2025
d6b6d34
feat(MultiLineChart): add emphasis prop for hover effects on dense se…
mattevans Oct 31, 2025
8cfb9bd
Merge pull request #245 from ethpandaops/more/tweaks
mattevans Oct 31, 2025
caf866e
Merge pull request #241 from ethpandaops/feat/donut
Savid Nov 1, 2025
05fb7bf
fix: resolve p5.js double rendering and improve lifecycle cleanup
Savid Nov 1, 2025
98a5963
Merge pull request #247 from ethpandaops/fix/p5js-cleanup-double-rend…
Savid Nov 1, 2025
2820dfb
fix: remove persistent focus outline from icons and buttons (#250)
samcm Nov 2, 2025
046baad
refactor: rename DAS Custody route to Custody (#251)
samcm Nov 2, 2025
da189aa
fix: improve chart hover interaction for flat segments (#252)
samcm Nov 2, 2025
822b059
perf(map): eliminate flickering and optimize live page performance (#…
samcm Nov 3, 2025
eed6ed0
Improve responsive layout for slot detail page charts (#253)
samcm Nov 3, 2025
32b28c9
feat: redirect to parent route on network change (#254)
samcm Nov 3, 2025
a53f600
feat: implement shared crosshairs for synchronized chart interactions…
samcm Nov 3, 2025
716b0db
refactor: migrate all timestamps to use Timestamp component with link…
samcm Nov 3, 2025
83004fd
refactor(epochs): improve UI layout and chart consistency (#258)
samcm Nov 3, 2025
d06faf4
Add toast notification for copy to clipboard in PopoutCard (#257)
samcm Nov 3, 2025
4582af0
fix: resolve chart double animation on mount (#259)
samcm Nov 3, 2025
048b5a7
refactor(live): fix ethereum live layout, chart rendering, and respon…
samcm Nov 3, 2025
d7ac9d8
refactor(epochs): update epoch art visualization and create shared Ta…
samcm Nov 3, 2025
46a616f
feat: improve UI/UX across charts, navigation, and data display (#262)
samcm Nov 3, 2025
55a5dff
feat: add ForkLabel component for beacon chain forks (#264)
samcm Nov 4, 2025
ba92b9b
feat: Split Entities page in to tab based layout (#263)
samcm Nov 4, 2025
4cb86c6
fix: add theme-specific Ethereum logos for better visibility (#266)
samcm Nov 4, 2025
efcf0e5
feat(slots): redesign slot detail page layout and execution tab (#265)
samcm Nov 4, 2025
0fceae5
feat(slots): add blob/data column spread visualization and PeerDAS su…
samcm Nov 4, 2025
d5fdb8e
fix: capitalize 'Data Column Spread' title properly
samcm Nov 4, 2025
d33f7b2
feat: add row_count field to data column API types (#268)
samcm Nov 4, 2025
8c6d7d9
feat: add scrollable tabs with navigation arrows (#267)
samcm Nov 4, 2025
8d46b33
feat: add network icon to mobile header (#269)
samcm Nov 4, 2025
c6dcc36
feat: hook up row_count to data column availability heatmap (#270)
samcm Nov 4, 2025
cb01994
Consolidate to Space Grotesk font only (#271)
samcm Nov 5, 2025
d9938f4
feat: add Ethereum forks subsection with countdown and timeline (#273)
samcm Nov 5, 2025
1f1a356
Add block explorer links to slot and epoch views (#272)
samcm Nov 5, 2025
fd4a2ba
feat(live-slot): improve live slot view UI and interactivity (#274)
samcm Nov 5, 2025
0db212d
fix small things
Savid Nov 5, 2025
9914b3f
Merge pull request #275 from ethpandaops/small-tysm-fixes
Savid Nov 5, 2025
e5b0d70
feat: add arrow navigation to slot and epoch detail pages (#276)
samcm Nov 5, 2025
cfac083
fix(fork-readiness): add safe navigation for min_client_versions
samcm Nov 5, 2025
5ef5939
Unify chart visual standards across application
samcm Nov 5, 2025
0033fec
Merge unify-chart-styles into release/frontend
samcm Nov 5, 2025
9f50c9e
fix: improve slot page UI and modal behavior (#278)
samcm Nov 5, 2025
98b42bf
feat: implement URL-based tab state management with hash anchor scrol…
samcm Nov 6, 2025
b1d0f58
feat: add block propagation CDF chart by node classification (#280)
samcm Nov 6, 2025
bb9d59a
feat: add viewport preloading to improve navigation performance
Savid Nov 6, 2025
f843c96
Merge pull request #281 from ethpandaops/feat/router-viewport-preloading
Savid Nov 6, 2025
a5f5bc5
fix: prevent scroll to top when switching tabs (#283)
samcm Nov 13, 2025
77de630
perf: optimize slot visualization components (#282)
samcm Nov 13, 2025
e1bf0c4
fix: expand Apple Watch detection to cover all model resolutions (#284)
samcm Nov 13, 2025
09fe47f
fix: better align the SlotProgressTimeline component (#286)
skylenet Nov 13, 2025
048f823
fix: improve Apple Watch detection with multi-heuristic approach (#285)
samcm Nov 13, 2025
0a91379
Improve continental propagation chart UX (#287)
samcm Nov 13, 2025
ab98e1e
fix: remove jarring cyan-to-pink gradient in star theme (#289)
samcm Nov 13, 2025
3142456
Revert "fix: add proper dependencies to Map2D useMemo to prevent stal…
samcm Nov 13, 2025
f4e004c
refactor: redesign slot progress timeline UI (#290)
samcm Nov 13, 2025
bdb3c80
fix: remount live slot page on network change (#288)
samcm Nov 13, 2025
63c75f2
refactor: soften slot phase timeline colors (#292)
samcm Nov 13, 2025
07866ae
chore: packages
Savid Nov 13, 2025
64a1937
update lock
Savid Nov 13, 2025
6029638
Merge pull request #293 from ethpandaops/chore/packages
Savid Nov 13, 2025
c899cc8
Fix offline validators chart calculation and display (#294)
samcm Nov 14, 2025
0aa2f54
perf: improve peerdas heatmap visualization with gradient and spacing…
samcm Nov 14, 2025
3cfd0cf
Fix missed slot status and add auto-refetch for live epochs (#295)
samcm Nov 14, 2025
1ba996c
feat(images): remove placeholder and unused Ethereum entities image f…
samcm Nov 14, 2025
87a487f
fix: correct attestation vote percentage calculation (#297)
samcm Nov 14, 2025
85ced15
feat(forks): add blob schedule timeline as fork parameters (#298)
samcm Nov 14, 2025
b22e015
refactor: update attestation liveness for PR #134 schema (#299)
samcm Nov 15, 2025
7876e0d
fix: improve map loading safety and UI (#300)
samcm Nov 15, 2025
d326a05
refactor: reorganize xatu feature images to section-based structure
Savid Nov 15, 2025
661ed57
Merge pull request #301 from ethpandaops/refactor/reorganize-xatu-fea…
Savid Nov 15, 2025
10c0883
feat: add build-time validation for route meta images (#302)
samcm Nov 15, 2025
2506960
fix: correct contributor route image paths to xatu section (#303)
samcm Nov 15, 2025
1b44c8d
feat: add ESLint rule for route image validation (#304)
samcm Nov 15, 2025
7b4098f
refactor: remove experimental language from meta and content (#306)
samcm Nov 15, 2025
16c2f37
chore: update xatu dashboard screenshots to latest version (#307)
mattevans Nov 15, 2025
9493372
chore: update ethereum epoch, live and slot preview images
mattevans Nov 15, 2025
8ba41f2
Merge pull request #308 from ethpandaops/refactor/imgs3
mattevans Nov 15, 2025
fbb3cfe
fix: correct logo aspect ratio in sidebar and mobile header
Savid Nov 15, 2025
7eef56a
Merge pull request #310 from ethpandaops/fix/logo-aspect-ratio
Savid Nov 15, 2025
2c329ec
feat: add GitHub and Twitter social links to sidebar footer (#309)
samcm Nov 15, 2025
a39e76a
fix: update propagation latency description to reflect live updates
mattevans Nov 15, 2025
645965a
Merge pull request #312 from ethpandaops/chore/correct-text
mattevans Nov 15, 2025
9cb9c1a
fix: clear map datapoints when slot ends (#311)
samcm Nov 15, 2025
b2ab358
fix: filter offline validators by missed_count > 0 at API level (#313)
samcm Nov 15, 2025
61baec6
fix(ForksHeader): show proper time-unit labels while countdown is loa…
mattevans Nov 15, 2025
d116e66
style(ForksHeader.tsx): add explicit void return type to updateCountd…
mattevans Nov 15, 2025
d5cc86f
Merge pull request #314 from ethpandaops/refactor/update-int-immediately
mattevans Nov 15, 2025
2a6f635
fix(MultiLine): enable chart updates when toggling series visibility
Savid Nov 15, 2025
2de830d
refactor(MultiLine): make notMerge configurable with prop
Savid Nov 15, 2025
924cab0
Merge pull request #315 from ethpandaops/fix/multiline-chart-series-t…
Savid Nov 15, 2025
dd409b0
feat(contributors): add Contributoor promo banner with panda image to…
mattevans Nov 15, 2025
b158140
fix: use canonical URLs with VITE_BASE_URL for all og:image and twitt…
Savid Nov 15, 2025
8ece919
Merge pull request #316 from ethpandaops/feat/contributoor-cta
mattevans Nov 15, 2025
99742d9
Merge pull request #317 from ethpandaops/fix/use-canonical-urls-for-o…
Savid Nov 15, 2025
0d14d55
optimize: resize client icons to ≤256px and strip metadata
Savid Nov 15, 2025
af47b98
Merge pull request #318 from ethpandaops/optimize/client-icons
Savid Nov 15, 2025
1ff5fe8
fix: add random chunk hashing to prevent cascade invalidation errors
Savid Nov 15, 2025
d1f2fc5
perf: use stable content hashes for fonts
Savid Nov 15, 2025
dba41c9
feat: add Phase0 as distinct genesis fork with timestamp display (#320)
samcm Nov 15, 2025
b0b55bf
Merge pull request #319 from ethpandaops/fix/vite-chunk-cascade-cache…
Savid Nov 15, 2025
08bda37
feat: add skeleton loaders for epochs, entities, and slot detail pages
Savid Nov 15, 2025
73f39bd
Merge pull request #321 from ethpandaops/feat/slot-detail-skeleton
Savid Nov 15, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
751 changes: 0 additions & 751 deletions .claude/commands/create-rest-api.md

This file was deleted.

409 changes: 409 additions & 0 deletions .claude/skills/create-new-component/SKILL.md

Large diffs are not rendered by default.

15 changes: 15 additions & 0 deletions .claude/skills/create-new-route/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
name: Create New Routes
description: Learn how to create a new route in The Lab.
---

# Create New Routes

This skill creates production-ready React routes following Lab's established architecture patterns.

## Routing & Pages
- Route files in `src/routes/` - thin TanStack Router definitions
- Page components in `src/pages/` - UI implementations
- Page-scoped components in `pages/[section]/components/`
- Dynamic routes use `$param.tsx` syntax
- Always barrel export via `index.tsx`
221 changes: 221 additions & 0 deletions .claude/skills/visualize-data/skill.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,221 @@
---
name: Visualize any data
description: Learn how to visualize data in a sustainable, accurate, and theme aware way.
---

Whenever Claude is asked to visualize data, you must follow the steps below.
- Chart components live in the `src/components/Charts` directory
- If you need a new core component type, create it in the `src/components/Charts` directory. Inspect the existing components to see how to create a new one. Seperation of concerns is important. Make storybook stories for the new component.
- `echarts` and `echarts-for-react` are the only libraries you can use to visualize data, and you must use them in the `src/components/Charts` directory.
- If you think the chart can be reusable, create it within the `src/components/*` directory. For example, `src/components/Ethereum/AttestationsByEntity`.

## Step 1: What Are You Trying to Show?

| Goal | Best Chart Types | Use When |
|------|------------------|----------|
| **Trend over time** | Line, Step, Area | X-axis is temporal (time, slot, epoch, block) |
| **Compare categories** | Bar, Column, Dot plot | Comparing distinct groups |
| **Show distribution** | Histogram, Box plot, Violin | Understanding spread/shape of data |
| **Show relationship** | Scatter, Bubble | Correlation between two+ variables |
| **Show composition** | Stacked bar, Pie, Treemap | Parts of a whole |
| **Show single value** | Number card, Gauge | Key metric snapshot |

## Step 2: Time-Series Data Patterns

### Data Type Detection → Interpolation Method

| Data Characteristics | Chart Config | Example Metrics |
|---------------------|--------------|-----------------|
| **Integer values only, non-negative** | Step chart: `step: 'middle'` | blob count, transaction count, user count |
| **Values hold between updates (state changes)** | Step chart: `step: 'start'` | validator status, network state, config value |
| **Continuous decimals, volatile** | Line: `smooth: false` | gas price, latency, response time |
| **Continuous decimals, trend focus** | Line: `smooth: true` | moving averages, smoothed rates |
| **Categorical states** | Step chart: `step: 'start'` + colors | validator status, network state |
| **Sparse/irregular events** | Scatter plot | slashing events, errors, alerts |

### Quick Decision Tree for Time-Series
```
Is data always integers?
├─ YES → Can you have 3.5 of this thing?
│ ├─ NO → Step chart (step: 'middle')
│ └─ YES → It's rounded data → Line chart
└─ NO → Does value stay constant between measurements?
├─ YES → Step chart (step: 'start')
└─ NO → Line chart (linear or smooth)
```

## Step 3: Non-Temporal Data Patterns

### Comparison Charts

| Scenario | Chart Type | Configuration Notes |
|----------|-----------|---------------------|
| Compare 3-10 categories | **Bar chart** (horizontal if labels long) | Start axis at zero |
| Compare 10+ categories | **Dot plot** or **Horizontal bar** | Easier to read labels |
| Compare across 2 dimensions | **Grouped bar** | Limit to 2-4 groups per category |
| Compare ratios/percentages | **Bar chart** | NOT pie chart |
| Compare ranges | **Box plot** | Shows min/max/quartiles |

### Distribution Charts

| Data Type | Chart Type | Use When |
|-----------|-----------|----------|
| Single continuous variable | **Histogram** | Show frequency distribution |
| Multiple distributions to compare | **Box plot** or **Violin plot** | Compare shapes across groups |
| Small dataset (<50 points) | **Dot plot** or **Strip plot** | Show individual points |
| Check for outliers | **Box plot** | Visualize quartiles and extremes |

### Relationship Charts

| Scenario | Chart Type | Notes |
|----------|-----------|-------|
| Two continuous variables | **Scatter plot** | Look for correlation |
| Three variables (2 continuous + 1 size) | **Bubble chart** | Size = third dimension |
| Many overlapping points | **Hex bin** or **2D histogram** | Shows density |
| Categorical + continuous | **Box plot** or **Violin** | Distribution per category |

### Composition Charts

| Scenario | Chart Type | Use When |
|----------|-----------|----------|
| Parts of whole (2-5 parts) | **Donut chart** | Simple proportions |
| Parts of whole (6+ parts) | **Bar chart** (NOT pie) | Too many slices are unreadable |
| Hierarchical composition | **Treemap** or **Sunburst** | Nested categories |
| Composition over time | **Stacked area** | Show how parts change |
| 100% composition | **Stacked bar (100%)** | Compare proportions across groups |

## Step 4: Universal Rules

### Always Do:

| Rule | Why | How |
|------|-----|-----|
| **Start Y-axis at zero for bars** | Human eyes judge area; starting elsewhere misleads | Set `yAxis: { min: 0 }` |
| **Use consistent colors** | Same metric = same color across charts | Define color palette |
| **Label axes clearly** | Include units (gwei, %, count, etc.) | `name: 'Gas Price (gwei)'` |
| **Limit colors per chart** | Too many colors = cognitive overload | Max 5-7 distinct colors |
| **Show data directly when <20 points** | Let users see actual values | Add data labels or table |
| **Use integers for count data** | Fractional counts don't exist | `yAxis: { minInterval: 1 }` |
| **Use filled step chart for count data** | Step chart is the most accurate way to represent count data | `step: 'middle'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2` |
| **Disable forced max label** | Prevents awkward tick spacing (e.g., 1, 6, 11, 16, 21, 26, 31, 32) | `axisLabel: { showMaxLabel: false }` in x-axis config |

### Never Do:

| Mistake | Why It's Bad | Correct Approach |
|---------|--------------|------------------|
| **Smooth lines for count data** | Implies fractional values exist (e.g., 3.5 transactions) | Use step chart |
| **Pie charts with >5 slices** | Impossible to compare similar-sized slices | Use bar chart |
| **3D charts** | Distorts perception, harder to read | Use 2D always |
| **Dual-axis with unrelated scales** | Can manipulate perception | Only if truly related metrics |
| **Too many series on one chart** | Becomes unreadable | Split into multiple charts |
| **Define your own color palette** | Use the `useThemeColors` hook to get the current theme colors | `const themeColors = useThemeColors();` |

## Step 5: Common Metric Patterns

### Pattern Library (Generic)

| Metric Type | Example | Chart | Settings |
|-------------|---------|-------|----------|
| **Event count per period** | "transactions per block" | Step | `step: 'middle'`, `minInterval: 1` |
| **Total/cumulative** | "total users", "cumulative revenue" | Area or Line | `smooth: false` or filled area |
| **Rate/percentage** | "success rate", "utilization %" | Line | `smooth: false`, range 0-100 |
| **Price/fee** | "gas price", "transaction fee" | Line or Step | Step if updates discrete, Line if continuous |
| **Average** | "average latency", "mean value" | Line | `smooth: true` for trends |
| **Status/state** | "server status", "order state" | Step | `step: 'start'`, use colors |
| **Distribution** | "transaction sizes" | Histogram | Bin count = √n as starting point |
| **Comparison** | "revenue by product" | Bar | Horizontal if many categories |
| **Correlation** | "price vs volume" | Scatter | Add trendline if useful |

## Step 6: Data Volume Guidelines

| Data Points | Approach | Reasoning |
|-------------|----------|-----------|
| **< 20 points** | Show all detail, consider data labels | Every point is visible |
| **20-100 points** | Show all, use tooltips | Still manageable |
| **100-1,000 points** | Show all with interaction (zoom/pan) | Need exploration tools |
| **1,000-10,000 points** | Aggregate OR downsample | Too dense for individual points |
| **> 10,000 points** | Must aggregate or use density visualization | Line chart becomes solid blob |

## Step 7: Interpolation Quick Reference

### Step Chart: When to Use Which Direction

| Direction | When to Use | Example |
|-----------|-------------|---------|
| `step: 'middle'` | Value **REPRESENTS THE ENTIRE PERIOD** | Blob count in slot N, transactions in block N, gas used in epoch N |
| `step: 'start'` | Value **HOLDS FROM** this point until next change | Validator status changed at slot N, config updated at block N |
| `step: 'end'` | Rarely used - value measured at end of period | Uncommon - consider `step: 'middle'` instead |

### Step Chart Visual Styling (IMPORTANT)

**Always use light fills with visible lines** for better readability and visual hierarchy:

```tsx
{
step: 'middle',
showArea: true,
areaOpacity: 0.3, // Light 30% fill - NOT solid (1.0)
lineWidth: 2, // Visible 2px line - NOT hidden (0)
showSymbol: false,
}
```

**Why this pattern:**
- ❌ **Heavy style** (`areaOpacity: 1`, `lineWidth: 0`) looks blocky, too visually dominant
- ✅ **Light style** (`areaOpacity: 0.3`, `lineWidth: 2`) maintains data visibility while being easier to read
- The visible line helps trace values, while the light fill provides context without overwhelming

### Smooth vs Linear for Continuous Data

| Use Case | Setting | When |
|----------|---------|------|
| **Show volatility/precision** | `smooth: false` | Raw measurements, user needs exact values |
| **Show overall trend** | `smooth: true` | Filtered/averaged data, focus on pattern |
| **Moving average** | `smooth: true` | Already smoothed data |
| **Real-time fluctuations** | `smooth: false` | Price tickers, live monitoring |

## Step 8: Validation Checklist

Before finalizing any chart, ask:

- [ ] **Reality check**: Can the values between my data points actually exist?
- If NO → Use step chart or scatter
- If YES → Use line chart

- [ ] **Zero baseline**: For bar charts, does Y-axis start at zero?
- If NO and showing bars → Fix it

- [ ] **Color count**: Am I using more than 7 colors?
- If YES → Reduce or group categories

- [ ] **Label clarity**: Can someone understand the chart without explanation?
- If NO → Improve axis labels and add units

- [ ] **Data density**: Are there so many points they overlap?
- If YES → Aggregate, downsample, or add interaction

- [ ] **Chart purpose**: Does this visualization answer the user's question?
- If NO → Choose different chart type

## Quick Decision Matrix

| I Have... | I Want To... | Use This |
|-----------|--------------|----------|
| Counts over time | Show exact counts per period | Step chart with filled area (`step: 'middle'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) |
| Measurements over time | Show trend | Line (smooth) |
| Measurements over time | Show volatility | Line (linear) |
| Values that update occasionally | Show when changes occur | Step chart with filled area (`step: 'start'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) |
| Categories to compare | Compare values | Bar chart (horizontal if labels long) |
| Parts of a whole | Show composition | Donut (if ≤5) or Bar chart |
| Two variables | Find correlation | Scatter plot |
| One variable distribution | Understand spread | Histogram or Box plot (small dataset (<50 points) use Dot plot or Strip plot) |
| States over time | Show transitions | Step chart with filled area (`step: 'start'`, `showArea: true`, `areaOpacity: 0.3`, `lineWidth: 2`) + colors |

## Key Principles to Remember

1. **Match visualization to data nature** - Don't force continuous interpolation on discrete data
2. **Simpler is better** - Use the simplest chart that answers the question
3. **Context matters** - Same data may need different viz for different questions
4. **Always label clearly** - Include units, axis names, and legends
5. **Test readability** - Can someone understand it in 5 seconds?
33 changes: 6 additions & 27 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,28 +1,7 @@
# ClickHouse Configuration
XATU_CLICKHOUSE_URL=clickhouse://username:password@clickhouse:9000/default
XATU_CLICKHOUSE_USERNAME=default
XATU_CLICKHOUSE_PASSWORD=
# OpenAPI specification input URL or path
# If not set, defaults to production mainnet API
OPENAPI_INPUT=http://localhost:8080/openapi.yaml

# API Service Configuration
API_HOST=0.0.0.0
API_PORT=8080

# Server (SRV) Service Configuration
SRV_ADDRESS=server:6666

# Redis Configuration
REDIS_URL=redis:6379

# S3/MinIO Configuration
S3_ENDPOINT=minio:9000
S3_REGION=us-east-1
S3_BUCKET=lab
S3_ACCESS_KEY=minioadmin
S3_SECRET_KEY=minioadmin

# Geolocation Configuration
GEOLOCATION_ENABLED=false
GEOLOCATION_DATABASE_LOCATION=/path/to/geolocation/database

# Frontend Configuration
VITE_BACKEND_URL=http://localhost:8080
# API base URL for runtime requests
# If not set, defaults to /api/v1
VITE_API_URL=http://localhost:8080
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @savid
89 changes: 89 additions & 0 deletions .github/workflows/alpha-release.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
name: Alpha Release

on:
push:
branches:
- 'release/**'

permissions:
contents: write

jobs:
alpha-release:
name: Build and Create Alpha Release
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
fetch-depth: 0

- name: Extract release name from branch
id: extract
run: |
BRANCH_NAME="${GITHUB_REF#refs/heads/release/}"
echo "release_name=$BRANCH_NAME" >> $GITHUB_OUTPUT

- name: Get latest tag version
id: version
run: |
RELEASE_NAME="${{ steps.extract.outputs.release_name }}"
# Get the latest tag for this release name
LATEST_TAG=$(git tag -l "${RELEASE_NAME}-v*" | sort -V | tail -n 1)

if [ -z "$LATEST_TAG" ]; then
# No existing tags, start at v0.0.1
NEW_VERSION="0.0.1"
else
# Extract version number and increment patch
VERSION="${LATEST_TAG#${RELEASE_NAME}-v}"
IFS='.' read -r major minor patch <<< "$VERSION"
NEW_VERSION="${major}.${minor}.$((patch + 1))"
fi

NEW_TAG="${RELEASE_NAME}-v${NEW_VERSION}"
echo "new_tag=$NEW_TAG" >> $GITHUB_OUTPUT
echo "new_version=$NEW_VERSION" >> $GITHUB_OUTPUT

- name: Create and push tag
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git tag ${{ steps.version.outputs.new_tag }}
git push origin ${{ steps.version.outputs.new_tag }}

- name: Set up pnpm
uses: pnpm/action-setup@v4
with:
version: 10

- name: Set up Node
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: 22
cache: 'pnpm'
cache-dependency-path: pnpm-lock.yaml

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Build project
run: pnpm build

- name: Create build archives
run: |
tar -czf lab-${{ steps.version.outputs.new_tag }}.tar.gz -C dist .
cd dist && zip -r ../lab-${{ steps.version.outputs.new_tag }}.zip . && cd ..

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.version.outputs.new_tag }}
name: ${{ steps.extract.outputs.release_name }} ${{ steps.version.outputs.new_version }} (Alpha)
prerelease: true
generate_release_notes: true
files: |
lab-${{ steps.version.outputs.new_tag }}.tar.gz
lab-${{ steps.version.outputs.new_tag }}.zip
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Loading