Bigkoo/Android-PickerView
This is a picker view for android , support linkage effect, timepicker and optionspicker.(时间选择器、省市区三级联动)
Stale — last commit 3y ago
weakest axislast commit was 3y ago; no CI workflows detected
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
last commit was 3y ago; no CI workflows detected
- ✓7 active contributors
- ✓Apache-2.0 licensed
- ✓Tests present
Show all 6 evidence items →Show less
- ⚠Stale — last commit 3y ago
- ⚠Concentrated ownership — top contributor handles 72% of recent commits
- ⚠No CI workflows detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days
- →Deploy as-is Mixed → Healthy if: 1 commit in the last 180 days
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Forkable" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/bigkoo/android-pickerview)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/bigkoo/android-pickerview on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Bigkoo/Android-PickerView
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/Bigkoo/Android-PickerView shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
WAIT — Stale — last commit 3y ago
- 7 active contributors
- Apache-2.0 licensed
- Tests present
- ⚠ Stale — last commit 3y ago
- ⚠ Concentrated ownership — top contributor handles 72% of recent commits
- ⚠ No CI workflows detected
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live Bigkoo/Android-PickerView
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/Bigkoo/Android-PickerView.
What it runs against: a local clone of Bigkoo/Android-PickerView — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in Bigkoo/Android-PickerView | Confirms the artifact applies here, not a fork |
| 2 | License is still Apache-2.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 1255 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Bigkoo/Android-PickerView. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Bigkoo/Android-PickerView.git
# cd Android-PickerView
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of Bigkoo/Android-PickerView and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Bigkoo/Android-PickerView(\\.git)?\\b" \\
&& ok "origin remote is Bigkoo/Android-PickerView" \\
|| miss "origin remote is not Bigkoo/Android-PickerView (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(Apache-2\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"Apache-2\\.0\"" package.json 2>/dev/null) \\
&& ok "license is Apache-2.0" \\
|| miss "license drift — was Apache-2.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java" \\
&& ok "pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java" \\
|| miss "missing critical file: pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java"
test -f "pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java" \\
&& ok "pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java" \\
|| miss "missing critical file: pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java"
test -f "pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java" \\
&& ok "pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java" \\
|| miss "missing critical file: pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java"
test -f "pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java" \\
&& ok "pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java" \\
|| miss "missing critical file: pickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java"
test -f "pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java" \\
&& ok "pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java" \\
|| miss "missing critical file: pickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 1255 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1225d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/Bigkoo/Android-PickerView"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
Android-PickerView is a native Android UI component library that implements iOS-style picker wheels for date/time selection and hierarchical option picking (e.g., province→city→district cascading). It provides TimePickerView for temporal selection in formats like YYYY-MM-DD HH:mm, and OptionsPickerView for single/multi-level selectable lists with optional linked dependencies. Monorepo structure: /pickerview/ module contains core WheelView-based picker logic (223k LOC Java); /app/ contains demo app with examples. Core lives in com.bigkoo.pickerview.view package. UI state managed via Builder pattern (TimePickerView.Builder, OptionsPickerView.Builder). Data binding uses Gson for JSON deserialization (see GetJsonDataUtil.java, province.json).
👥Who it's for
Android developers building mobile apps that require date pickers, time pickers, or cascading selection dropdowns (like location selectors). Specifically useful for e-commerce, travel, and logistics apps targeting Chinese markets where province/city/district selection is common.
🌱Maturity & risk
Mature but officially unmaintained: README explicitly states '已停止更新' (stopped updating). ~4.9k stars and archived state indicate stable production use by legacy projects. Last significant release was v4.1.9 (2019-10-20). No active CI/CD pipeline visible. Verdict: legacy production-ready code — suitable for production if no critical bugs, but expect no security patches or Android API updates.
High risk for new projects: marked as discontinued/unmaintained. Likely incompatible with modern Android (targets API 26, dated 2017 compile targets). Single-maintainer/archived project with no visible issue triage. Dependencies include outdated gradle and support library (appcompat-v7:26.1.0 from 2017). Recommend forking the source into your module rather than taking dependency.
Active areas of work
Nothing — project is archived. README notes '原有版本jcenter库可以继续使用。建议直接下载源码引入 module 到自己项目改造' (continue using existing jcenter version; recommend downloading source code and integrating module into your own project for modifications). No active PRs, issues, or commits expected.
🚀Get running
Check README for instructions.
Daily commands:
# Run demo app on connected device/emulator
./gradlew :app:installDebug
adb shell am start -n com.bigkoo.pickerviewdemo/.MainActivity
# Or in Android Studio: select 'app' module and click Run (▶)
🗺️Map of the codebase
pickerview/src/main/java/com/bigkoo/pickerview/view/BasePickerView.java— Core abstract base class for all picker views; defines lifecycle, dialog behavior, and common UI logic that all pickers inherit frompickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java— Builder pattern implementation for TimePickerView configuration; essential entry point for time selection functionalitypickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java— Builder pattern implementation for OptionsPickerView configuration; handles cascading/linkage picker setuppickerview/src/main/java/com/bigkoo/pickerview/view/WheelOptions.java— Implements the scrollable wheel view for option selection with linkage support; core UI rendering componentpickerview/src/main/java/com/bigkoo/pickerview/view/WheelTime.java— Implements the scrollable wheel view for time selection with year/month/day/hour/minute granularitypickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java— Configuration data class that holds all customizable picker settings; central configuration model for all picker typesapp/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java— Main demo activity showing usage patterns for TimePickerView and OptionsPickerView with examples
🛠️How to make changes
Add a new Time Picker Dialog
- Create a TimePickerBuilder instance with your Activity/Fragment context (
pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java) - Configure range (start/end year, month, day) and set OnTimeSelectListener callback (
pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java) - Call .build() to create TimePickerView and .show() to display as dialog (
pickerview/src/main/java/com/bigkoo/pickerview/view/TimePickerView.java) - Reference app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java for complete example (
app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java)
Add a cascading/linkage Options Picker for hierarchical data
- Prepare hierarchical data model with parent-child relationships (e.g., Province → City → District) (
app/src/main/java/com/bigkoo/pickerviewdemo/bean/ProvinceBean.java) - Create an OptionsPickerBuilder and call setData() with your hierarchical list structure (
pickerview/src/main/java/com/bigkoo/pickerview/builder/OptionsPickerBuilder.java) - Set OnOptionsSelectChangeListener to detect level changes and update child data dynamically (
pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectChangeListener.java) - Set OnOptionsSelectListener for final selection confirmation callback (
pickerview/src/main/java/com/bigkoo/pickerview/listener/OnOptionsSelectListener.java) - Call .build() and .show() to display the cascading picker (
pickerview/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java)
Customize picker appearance (colors, fonts, animations)
- Access PickerOptions via builder.setPickerOptions() to configure UI properties (
pickerview/src/main/java/com/bigkoo/pickerview/configure/PickerOptions.java) - Set properties like textColor, textSize, dividerColor, backgroundColor, wheelItemCount (
pickerview/src/main/java/com/bigkoo/pickerview/builder/TimePickerBuilder.java) - Configure animation behavior via setAnimationDuration() and setAnimationStyle() (
pickerview/src/main/java/com/bigkoo/pickerview/utils/PickerViewAnimateUtil.java) - Reference demo activity to see all available customization options in practice (
app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java)
Load hierarchical data from JSON file
- Place JSON file in assets/ folder (e.g., province.json with province/city/district structure) (
app/src/main/assets/province.json) - Use GetJsonDataUtil to parse JSON and convert to bean objects (
app/src/main/java/com/bigkoo/pickerviewdemo/GetJsonDataUtil.java) - Pass parsed data to OptionsPickerBuilder.setData() for cascading display (
app/src/main/java/com/bigkoo/pickerviewdemo/JsonDataActivity.java)
🔧Why these technologies
- Custom Android View/WheelView — Provides smooth, efficient scrollable picker UX without external dependencies; draws item labels with precise measurement and invalidation
- **** — undefined
🪤Traps & gotchas
Calendar month indexing: Java Calendar uses 0-indexed months (0=January, 11=December); examples in README show this causes bugs. API 26 target outdated: minSdkVersion 14 means testing on modern APIs (31+) may expose issues. jcenter deprecated: library published to now-defunct Bintray/jcenter (comments in gradle show fallback). No AndroidX migration: uses deprecated com.android.support:appcompat-v7:26.1.0; adding AndroidX libraries may cause build conflicts. WheelView 3D effect CPU-intensive: rotation animation may stutter on low-end devices. Chinese default text: UI strings default to uppercase in Chinese; English localization mentioned as issue in v4.1.9 changelog.
🏗️Architecture
💡Concepts to learn
- 3D Perspective Transformation via 2D Layers — Core mechanism of WheelView's fake 3D rotation effect; essential to understand how the picker creates the iOS-style rolling motion without actual 3D graphics
- Hierarchical Linked Data Selection (Cascade/Linkage) — OptionsPickerView's multi-level dependent selection (e.g., pick province, then city options update); critical pattern for geography/taxonomy pickers
- Builder Pattern for Complex Object Construction — TimePickerView.Builder and OptionsPickerView.Builder exemplify fluent API design; makes configuration readable and chainable in production code
- Java Calendar Month 0-Indexing Quirk — Frequent source of off-by-one bugs in date pickers; Java Calendar.set(year, month, day) uses month 0-11, not 1-12 — critical to understand when setting ranges
- ViewGroup Custom Measurement & Layout — WheelView extends ViewGroup to manage multi-item vertical scrolling with custom onMeasure/onLayout; foundational for understanding picker rendering
- Scroller/OverScroller for Momentum Scrolling — Wheel picker momentum scroll (fling) behavior is likely implemented via Android's Scroller class; essential for smooth UX
- JSON Data Binding for Hierarchical Lists — Cascade pickers require nested JSON (province.json) deserialized into bean hierarchies; Gson usage in GetJsonDataUtil shows practical marshaling pattern
🔗Related repos
weidongjian/android-wheel— Predecessor/inspiration for wheel-scrolling UI; foundational 3D wheel implementation that Android-PickerView builds uponjzxiang/SwipeSelector— Modern alternative for horizontal picker selection; lighter-weight than PickerView but lacks hierarchical linkage supportloperSeven/DatePicker— Contemporary Android date picker with Material Design; addresses same use case with newer UI patternsgzu-liyujiang/AndroidPicker— Active fork/successor improving on Android-PickerView; more recently maintained alternative for cascade selectionliyujiang-gzu/CSIPicker— Focused implementation of China's province/city/district (城市选择器) picker; narrower scope but better maintained
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add AndroidX migration support and update deprecated dependencies
The project uses outdated Android Support Library (com.android.support:appcompat-v7:26.1.0) and targets compileSdkVersion 26, which is several years old. Google deprecated Support Library in favor of AndroidX. This is a critical modernization PR that would: (1) Migrate to AndroidX equivalents, (2) Update compileSdkVersion to at least 31+, (3) Update targetSdkVersion to match current Google Play requirements, and (4) Ensure compatibility with modern Android devices and the latest Gradle toolchain.
- [ ] Update app/build.gradle: Replace com.android.support:appcompat-v7 with androidx.appcompat:appcompat
- [ ] Update gradle.properties to enable androidx: add android.useAndroidX=true and android.enableJetifier=true
- [ ] Update compileSdkVersion and targetSdkVersion to 33+ in app/build.gradle and pickerview/build.gradle
- [ ] Update all imports in source files from android.support.* to androidx.* (e.g., in MainActivity.java, FragmentTestActivity.java)
- [ ] Test all demo activities and verify time picker, options picker, and linkage picker still function correctly
Add comprehensive unit and instrumented tests for PickerView core components
The repository has minimal test coverage (only app/src/androidTest/java/com/bigkoo/pickerviewdemo/ApplicationTest.java exists as a placeholder). The pickerview library module lacks any unit tests. A proper test suite should cover: (1) WheelView scroll behavior and item selection logic, (2) TimePickerView date/time parsing and validation, (3) OptionsPickerView linkage logic for province-city-district relationships, and (4) Custom adapter data binding. This ensures reliability as the library is maintained.
- [ ] Create pickerview/src/test/java/com/bigkoo/pickerviewdemo/ with unit tests for wheel view mechanics (scrolling, selection, boundary conditions)
- [ ] Create pickerview/src/androidTest/java/ with instrumented tests for time picker validation (leap years, month boundaries, timezone handling)
- [ ] Add tests in pickerview/src/androidTest/ for OptionsPickerView linkage, specifically testing the province.json data flow and cascading updates
- [ ] Create tests for edge cases: empty data sets, null callbacks, rapid successive selections
- [ ] Update build.gradle files to add testImplementation 'junit:junit:4.13.2' and androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
Refactor monolithic WheelView into separate focused components and document public API
The README explicitly states the project is no longer maintained and recommends downloading source to modify locally. To improve maintainability and usability, the large WheelView implementation should be refactored into smaller, single-responsibility components (e.g., WheelScroller, WheelDataAdapter, WheelRenderer). Additionally, create comprehensive API documentation with JavaDoc comments for all public classes/methods in the pickerview module. This allows new contributors to understand the architecture and enables easier customization without forking.
- [ ] Analyze pickerview/src/main/java/com/bigkoo/pickerviewdemo/WheelView.java and identify methods that can be extracted into separate classes (create WheelPhysicsEngine, WheelDataProvider, WheelUIRenderer classes)
- [ ] Add detailed JavaDoc comments to all public methods in WheelView, TimePickerView, OptionsPickerView, and adapter classes (referencing specific files in pickerview/src/main/java)
- [ ] Create pickerview/README.md documenting: public API surface, initialization examples, customization hooks, and the internal architecture diagram
- [ ] Add method-level documentation for callbacks like OnOptionsSelectListener, OnTimeSelectListener in pickerview/src/main/java interfaces
- [ ] Update main README.md with link
🌿Good first issues
- Add unit tests for date range validation: TimePickerView.java lacks tests for
setRangeStart()andsetRangeEnd()edge cases (e.g., invalid ranges, leap-year handling, Calendar month off-by-one). Write JUnit tests in/app/src/androidTest/java/com/bigkoo/pickerviewdemo/targeting these methods. - Modernize gradle and dependencies: Update
app/build.gradleto use targetSdkVersion 31+, migrateappcompat-v7:26.1.0to AndroidXandroidx.appcompat:appcompat:1.x, and update GSON to latest. Maintain backward compatibility with minSdkVersion 14. - Document the WheelView 3D transformation math: Add JavaDoc to the core wheel rotation logic (likely in a WheelView subclass not visible in file list but referenced in pickerview module) explaining the alpha/translation layer mechanics that create the 3D effect. Link to blog post already mentioned in README.
⭐Top contributors
Click to expand
Top contributors
- @xiaosong520 — 72 commits
- @zengsong — 23 commits
- @lxt1994 — 1 commits
- @MankinChung — 1 commits
- @Muyangmin — 1 commits
📝Recent commits
Click to expand
Recent commits
e200d8c— Update README.md (xiaosong520)dd43726— Update README.md (xiaosong520)e7de78b— Update README.md (xiaosong520)48bb91d— Update README.md (xiaosong520)a47017f— Update README.md (xiaosong520)9345964— update version (zengsong)ead0472— Merge remote-tracking branch 'origin/master' (zengsong)1562e05— optimization code (zengsong)8c1eda7— update README.md (zengsong)c66bd05— Merge pull request #824 from Bigkoo/dev4.x (xiaosong520)
🔒Security observations
This Android PickerView library has significant security concerns. The project is unmaintained and uses severely outdated dependencies (2016-2017 era) with known vulnerabilities. Critical issues include GSON 2.7 with deserialization vulnerabilities, Android support library 26.x (EOL), disabled code obfuscation, and suppressed lint security checks. The low minimum SDK version (API 14) further expands the attack surface. Immediate action is required to update all dependencies and re-enable security tooling if this library is to be used in production.
- High · Outdated Gradle Plugin and Dependencies —
app/build.gradle, pickerview/build.gradle. The project uses Android Gradle Plugin and support libraries from 2017 (compileSdkVersion 26, appcompat-v7:26.1.0). These versions are severely outdated and contain numerous known security vulnerabilities. Support library 26.x reached end-of-life and no longer receives security patches. Fix: Update to Android SDK 31 or higher (target API 34+), migrate from android.support libraries to AndroidX (androidx.appcompat:appcompat), and use appcompat-v7:28.0.0 or androidx.appcompat:appcompat:1.6.1 or newer. - High · Outdated GSON Dependency —
app/build.gradle. GSON 2.7 was released in 2016 and contains known vulnerabilities (CVE-2020-5410 and others). The library does not properly handle deserialization of untrusted data, which could lead to arbitrary code execution or denial of service attacks. Fix: Update GSON to version 2.10.1 or later (com.google.code.gson:gson:2.10.1). - Medium · Minify Disabled in Release Build —
app/build.gradle (release buildType). The release build has minifyEnabled set to false. This means the app is shipped with readable, unobfuscated code that makes reverse engineering and security analysis easier for attackers. Fix: Set minifyEnabled to true and ensure proguard-rules.pro is properly configured to obfuscate code while preserving necessary classes. - Medium · Lint Security Checks Disabled —
app/build.gradle (lintOptions block). The lintOptions configuration disables lint error checking (abortOnError false, checkReleaseBuilds false). This suppresses important security and code quality warnings that could indicate vulnerabilities. Fix: Remove or minimize lintOptions suppression. Enable security-related lint checks: remove 'checkReleaseBuilds false' or set it to true, and specifically enable security checks. - Medium · Low Minimum SDK Version —
app/build.gradle (defaultConfig). minSdkVersion 14 targets very old Android versions (4.0+) from 2012-2013. These versions contain numerous unpatched security vulnerabilities at the OS level. Supporting such old versions increases attack surface. Fix: Increase minSdkVersion to at least 21 (Android 5.0) or preferably 24+ (Android 7.0+) to ensure users have access to modern security patches. - Low · Project No Longer Maintained —
README.md. The README explicitly states '已停止更新' (stopped updating). This is an unmaintained project that will not receive security patches or updates. Using unmaintained code introduces risk of unpatched vulnerabilities. Fix: Consider using actively maintained alternatives or forking and maintaining the code internally. If using this library, conduct thorough security review and maintain your own patches.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.