ybq/Android-SpinKit
Android loading animations
Stale — last commit 3y ago
weakest axislast commit was 3y ago; no tests detected…
no tests detected; no CI workflows detected…
Documented and popular — useful reference codebase to read through.
last commit was 3y ago; no CI workflows detected
- ✓12 active contributors
- ✓MIT licensed
- ⚠Stale — last commit 3y ago
Show all 6 evidence items →Show less
- ⚠Concentrated ownership — top contributor handles 63% of recent commits
- ⚠No CI workflows detected
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Mixed → Healthy if: 1 commit in the last 365 days; add a test suite
- →Fork & modify Mixed → Healthy if: add a test suite
- →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 "Great to learn from" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/ybq/android-spinkit)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/ybq/android-spinkit on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: ybq/Android-SpinKit
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/ybq/Android-SpinKit 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
- 12 active contributors
- MIT licensed
- ⚠ Stale — last commit 3y ago
- ⚠ Concentrated ownership — top contributor handles 63% of recent commits
- ⚠ No CI workflows detected
- ⚠ No test directory 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 ybq/Android-SpinKit
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/ybq/Android-SpinKit.
What it runs against: a local clone of ybq/Android-SpinKit — 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 ybq/Android-SpinKit | Confirms the artifact applies here, not a fork |
| 2 | License is still MIT | 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 ≤ 1106 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of ybq/Android-SpinKit. If you don't
# have one yet, run these first:
#
# git clone https://github.com/ybq/Android-SpinKit.git
# cd Android-SpinKit
#
# 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 ybq/Android-SpinKit and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "ybq/Android-SpinKit(\\.git)?\\b" \\
&& ok "origin remote is ybq/Android-SpinKit" \\
|| miss "origin remote is not ybq/Android-SpinKit (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(MIT)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"MIT\"" package.json 2>/dev/null) \\
&& ok "license is MIT" \\
|| miss "license drift — was MIT 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 "library/src/main/java/com/github/ybq/android/spinkit/SpinKitView.java" \\
&& ok "library/src/main/java/com/github/ybq/android/spinkit/SpinKitView.java" \\
|| miss "missing critical file: library/src/main/java/com/github/ybq/android/spinkit/SpinKitView.java"
test -f "library/src/main/java/com/github/ybq/android/spinkit/SpriteFactory.java" \\
&& ok "library/src/main/java/com/github/ybq/android/spinkit/SpriteFactory.java" \\
|| miss "missing critical file: library/src/main/java/com/github/ybq/android/spinkit/SpriteFactory.java"
test -f "library/src/main/java/com/github/ybq/android/spinkit/Style.java" \\
&& ok "library/src/main/java/com/github/ybq/android/spinkit/Style.java" \\
|| miss "missing critical file: library/src/main/java/com/github/ybq/android/spinkit/Style.java"
test -f "library/src/main/java/com/github/ybq/android/spinkit/animation/SpriteAnimatorBuilder.java" \\
&& ok "library/src/main/java/com/github/ybq/android/spinkit/animation/SpriteAnimatorBuilder.java" \\
|| miss "missing critical file: library/src/main/java/com/github/ybq/android/spinkit/animation/SpriteAnimatorBuilder.java"
test -f "library/src/main/java/com/github/ybq/android/spinkit/sprite/Sprite.java" \\
&& ok "library/src/main/java/com/github/ybq/android/spinkit/sprite/Sprite.java" \\
|| miss "missing critical file: library/src/main/java/com/github/ybq/android/spinkit/sprite/Sprite.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 1106 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1076d)"
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/ybq/Android-SpinKit"
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-SpinKit is a library that provides 12+ pre-built loading animation styles (RotatingPlane, DoubleBounce, Wave, Pulse, ChasingDots, etc.) as customizable Android drawable widgets. It ports the web-based SpinKit animations to Android by implementing them as custom Drawable sprites with frame-based property animations, allowing developers to drop loading indicators into layouts via XML or programmatically as ProgressBar indeterminate drawables. Single-module library structure: core animation engine lives in library/src/main/java/com/github/ybq/android/spinkit/ organized by concern—SpinKitView.java is the main View widget, SpriteFactory.java instantiates animation styles, animation/ subpackage contains timing logic (SpriteAnimatorBuilder, AnimationUtils, custom interpolators), and sprite/ subpackage contains drawable shapes (CircleSprite, CircleLayoutContainer). Gradle-based monorepo with library/ as the publishable artifact.
👥Who it's for
Android app developers who need polished, battle-tested loading spinners without building custom Canvas drawing code. Used by developers building apps that require visual feedback during network requests or background tasks and want pre-designed, production-grade animations rather than simple ProgressBar defaults.
🌱Maturity & risk
Moderately mature and stable. The library reached version 1.4.0 and provides a complete artifact on JCenter/Maven Central (build.gradle shows jcenter() repos). However, the visible file list shows no test directory structure, no CI config file (no .github/workflows or Travis CI), and no recent commit timestamps are visible—suggesting either stable maintenance mode or potential staleness. The 70KB Java codebase and complete animation portfolio indicate solid foundational work, but lack of automated testing is a maturity gap.
Low-to-moderate risk for stable use, but some concerns: (1) No visible test suite in the file structure means animations rely on manual visual validation; (2) Single package maintainer (ybq) with no visible CI/CD means breaking changes could ship silently; (3) Gradle config uses older syntax (classpath 'com.novoda:bintray-release:0.8.1'), suggesting it may not follow latest Android build best practices; (4) No visible API versioning strategy—updates could break apps using older animation properties.
Active areas of work
No recent commit metadata is visible in the provided data, so active development status is unclear. The file list shows complete animation implementations (12 animation types visible in art/ GIFs), suggesting the feature set is finalized. No open PRs, issues, or milestones are mentioned, indicating either stable-but-dormant maintenance or that the repo is not actively tracking work in a visible way.
🚀Get running
Clone and build with Gradle: git clone https://github.com/ybq/Android-SpinKit.git && cd Android-SpinKit && ./gradlew build. For Gradle Wrapper on Windows, use gradlew.bat build. To use in your project, add to build.gradle: implementation 'com.github.ybq:Android-SpinKit:1.4.0' (requires jcenter() repository).
Daily commands:
This is a library, not an app. To build: ./gradlew library:build. To run the included demo APK (art/spinkit.apk), install on an emulator or device: adb install art/spinkit.apk. To develop: open in Android Studio (File > Open > select root directory), sync Gradle, and modify files under library/src/main/java/.
🗺️Map of the codebase
library/src/main/java/com/github/ybq/android/spinkit/SpinKitView.java— Main entry point and public API—all loading animations are created and controlled through this custom View classlibrary/src/main/java/com/github/ybq/android/spinkit/SpriteFactory.java— Factory pattern implementation that instantiates all 12 animation styles; essential for understanding how animations are createdlibrary/src/main/java/com/github/ybq/android/spinkit/Style.java— Enum defining all available animation styles (Circle, DoubleBounce, Wave, etc.); the core public API surfacelibrary/src/main/java/com/github/ybq/android/spinkit/animation/SpriteAnimatorBuilder.java— Builds ObjectAnimator instances for sprite animations; orchestrates timing, interpolation, and animation lifecyclelibrary/src/main/java/com/github/ybq/android/spinkit/sprite/Sprite.java— Abstract base class defining the animation contract; all visual elements inherit from thislibrary/src/main/java/com/github/ybq/android/spinkit/sprite/SpriteContainer.java— ViewGroup that manages multiple Sprite instances and layout; bridges sprites to Android rendering pipelinelibrary/src/main/res/values/attrs.xml— Defines XML attributes (SpinKit_Color, etc.) that enable declarative configuration in layouts
🛠️How to make changes
Add a New Animation Style
- Create a new class in library/src/main/java/com/github/ybq/android/spinkit/style/ extending an appropriate Sprite type (
library/src/main/java/com/github/ybq/android/spinkit/style/NewStyle.java) - Implement onCreate() to create and add Sprite instances to the container; call setupAnimations() to attach animators (
library/src/main/java/com/github/ybq/android/spinkit/style/NewStyle.java) - Add a NEW_STYLE enum value to library/src/main/java/com/github/ybq/android/spinkit/Style.java (
library/src/main/java/com/github/ybq/android/spinkit/Style.java) - Add case branch in SpriteFactory.create() to instantiate your new style (
library/src/main/java/com/github/ybq/android/spinkit/SpriteFactory.java) - Optionally add a demo item to sample/src/main/java/com/github/ybq/android/loading/MainActivity.java to showcase it (
sample/src/main/java/com/github/ybq/android/loading/MainActivity.java)
Customize Animation Timing and Interpolation
- In your style class's setupAnimations() method, use SpriteAnimatorBuilder to configure duration and start delay (
library/src/main/java/com/github/ybq/android/spinkit/animation/SpriteAnimatorBuilder.java) - Chain .interpolator() with a pre-built Ease function (e.g., Ease.easeInOutCubic) or custom interpolator (
library/src/main/java/com/github/ybq/android/spinkit/animation/interpolator/Ease.java) - Call .build() to create the ObjectAnimator and start it with .start() (
library/src/main/java/com/github/ybq/android/spinkit/animation/SpriteAnimatorBuilder.java)
Create a Custom Sprite Shape
- Extend ShapeSprite in library/src/main/java/com/github/ybq/android/spinkit/sprite/ (
library/src/main/java/com/github/ybq/android/spinkit/sprite/ShapeSprite.java) - Override onCreate() to create a custom Drawable (e.g., GradientDrawable, VectorDrawable) and set it with setDrawable() (
library/src/main/java/com/github/ybq/android/spinkit/sprite/ShapeSprite.java) - Use FloatProperty or IntProperty wrappers to expose animatable properties (position, scale, rotation, alpha) (
library/src/main/java/com/github/ybq/android/spinkit/animation/FloatProperty.java) - Add sprite instances to a SpriteContainer and attach animators via SpriteAnimatorBuilder (
library/src/main/java/com/github/ybq/android/spinkit/sprite/SpriteContainer.java)
🔧Why these technologies
- Android View (custom subclass of ProgressBar) — Integrates seamlessly with Android UI framework; allows declarative XML configuration and ProgressBar compatibility
- ObjectAnimator + Property Animation — Provides smooth hardware-accelerated animations with interpolation; avoids legacy View animations
- Drawable-based rendering — Lightweight, scalable, and resolution-independent; leverages Android's drawing system for efficient rendering
- ViewGroup (SpriteContainer) — Manages layout and z-order of multiple sprites; integrates with standard Android layout system
⚖️Trade-offs already made
-
Factory pattern for sprite instantiation
- Why: Decouples animation selection from sprite creation; easier to add new styles without modifying SpinKitView
- Consequence: Adds a layer of indirection; styles must be registered in SpriteFactory
-
Abstract Sprite base class instead of composition
- Why: Enforces consistent lifecycle (onCreate, onBoundsChange, draw) across all animations
- Consequence: undefined
🪤Traps & gotchas
No hidden traps visible in the provided data. However, note: (1) Library uses proguard-rules.pro (library/proguard-rules.pro)—ensure ProGuard/R8 doesn't strip animation-related reflection if used; (2) Custom Interpolator classes may require minSdkVersion checking (PathInterpolatorCompatApi21 suggests API 21+ for some features); (3) No visible constraints on animation duration or resource limits—creating many SpinKitView instances simultaneously could cause performance issues on older devices.
🏗️Architecture
💡Concepts to learn
- ObjectAnimator and Property Animation Framework — Core Android framework (API 11+) used throughout SpinKit to animate drawable properties (rotation, alpha, scale) over time; understanding how SpriteAnimatorBuilder wraps ObjectAnimator is essential to extending animations
- Interpolator (Easing Functions) — SpinKit implements custom Interpolator classes (Ease.java, KeyFrameInterpolator) to control animation pacing; without understanding easing, animations feel robotic rather than polished
- Custom Drawable and Canvas Rendering — Sprite classes extend Drawable and override onDraw(); understanding Canvas coordinate transforms and drawing primitives (circles, paths) is needed to add new animation types
- Factory Pattern — SpriteFactory.createSprite(Style) demonstrates the factory pattern for object creation; this is how the library decouples style selection from implementation
- Keyframe Animation and Timeline Composition — Complex animations like Wave or CubeGrid are built by composing multiple property animations (via AnimatorSet or sequential/parallel ObjectAnimators) with precise timing offsets; KeyFrameInterpolator enables frame-by-frame control
- XML Layout Inflation and Custom Attributes — SpinKitView is inflatable from XML with custom namespace attributes (app:SpinKit_Color, style references); understanding how AttributeSet parsing and TypedArray work is needed to maintain or extend attribute support
- Proguard/R8 Obfuscation and Reflection Safety — Library includes proguard-rules.pro; if animations use reflection or dynamic class loading, obfuscation must preserve those paths—understanding ProGuard rules prevents animations breaking in release builds
🔗Related repos
tobiasahlin/SpinKit— The original CSS/JavaScript loading animation library that inspired Android-SpinKit; reference for animation designs and timing curvesdaimajia/AndroidViewAnimations— Complementary Android animation library providing general-purpose view animations (fade, rotate, scale) that can be combined with SpinKit loadersairbnb/lottie-android— Alternative for complex loading animations using JSON-based vector animations from After Effects, useful when SpinKit's built-in styles don't fit design needssquare/okhttp— Commonly paired with SpinKit in real apps—OkHttp handles network requests while SpinKit shows the loading spinner during async operationsReactiveX/RxAndroid— Pairs well with SpinKit for reactive apps—RxJava observables trigger network calls while SpinKit visualizes the async work
🪄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 missing Wave and RotatingCircle animation style implementations
The file structure shows art/Wave.gif and art/RotatingCircle.gif animation previews, but library/src/main/java/com/github/ybq/android/spinkit/style/ is missing Wave.java and RotatingCircle.java implementations. These are advertised in the demo but not implemented, causing gaps in the Style.java enum and SpriteFactory.java factory pattern.
- [ ] Create library/src/main/java/com/github/ybq/android/spinkit/style/Wave.java with proper sprite animation logic
- [ ] Create library/src/main/java/com/github/ybq/android/spinkit/style/RotatingCircle.java with proper sprite animation logic
- [ ] Add Wave and RotatingCircle to Style.java enum if missing
- [ ] Update SpriteFactory.java to handle instantiation of the new style classes
- [ ] Test both new animations render correctly using the demo app
Add instrumented unit tests for SpinKitView lifecycle and animation state
The repository has no test directory structure visible. SpinKitView.java is the core component managing animation state, visibility, and sprite creation. Critical tests are missing for lifecycle hooks (onCreate, onStart, onStop), animation pause/resume, and color property changes via app:SpinKit_Color attribute.
- [ ] Create library/src/androidTest/java/com/github/ybq/android/spinkit/ directory structure
- [ ] Add SpinKitViewTest.java with tests for: animation start/stop, visibility changes, color property binding via XML attributes
- [ ] Add SpriteFactoryTest.java to verify all Style enum values produce valid Sprite instances
- [ ] Add test for memory leaks when animations are repeatedly started/stopped
- [ ] Update library/build.gradle to include androidx.test:runner and Espresso dependencies
Add GitHub Actions CI workflow for build verification and APK generation
No .github/workflows directory exists for CI/CD. The project uses Gradle 3.2.1 (relatively old) and bintray-release which is deprecated. A CI workflow would catch build failures early, verify all Style implementations work, and could auto-generate demo APK artifacts on releases.
- [ ] Create .github/workflows/android-build.yml with: checkout, setup Java, run gradlew build for library module
- [ ] Add build verification step that checks all Style enum values instantiate without errors
- [ ] Add optional APK artifact generation using gradlew assembleDebug to create demo APK on release tags
- [ ] Ensure workflow runs on: pull_request, push to main branch
- [ ] Test workflow locally using act tool to verify Gradle build succeeds before committing
🌿Good first issues
- Add unit tests for animation interpolators: Create tests in library/src/test/ for Ease.java and KeyFrameInterpolator.java to verify easing curves match expected values at key points (0%, 50%, 100%), improving confidence in motion feel across devices.
- Document animation timing parameters: Add JavaDoc comments to SpriteAnimatorBuilder.java and each Sprite subclass showing duration, delay, and repeat count values used, so contributors understand how to tune animation pacing when adding new styles.
- Add missing animation styles from original SpinKit: The web SpinKit has 14+ styles; check which ones are absent in library/src/main/java/com/github/ybq/android/spinkit/sprite/ and implement 2-3 missing ones (e.g., if any GIFs in art/ lack corresponding sprite classes).
⭐Top contributors
Click to expand
Top contributors
- @ybq — 49 commits
- @start141 — 15 commits
- @littleGnAl — 3 commits
- @Nikhil-z — 2 commits
- @firetrap — 2 commits
📝Recent commits
Click to expand
Recent commits
aa83e4d— add spinkit.apk (ybq)5699c19— Optimized code (ybq)eede879— Update README.md (ybq)de429bd— update README (ybq)cb9250c— version 1.2.0 (ybq)d15b73b— Merge pull request #42 from firetrap/master (ybq)dcd8e72— Merge branch 'master' into master (ybq)864dea1— Merge pull request #56 from javichaques/master (ybq)cfb39d8— Merge pull request #54 from Nikhil-z/master (ybq)4e541d0— Migrate to Android X (javichaques)
🔒Security observations
The Android-SpinKit codebase has moderate security concerns primarily related to outdated build infrastructure and deprecated dependencies. The main risks include: (1) Gradle 3.2.1 is severely outdated with unpatched vulnerabilities, (2) Bintray plugin dependency is dead/unmaintained, and (3) JCenter repository is deprecated. These issues create supply chain and maintenance risks. The codebase itself (animation library) has low inherent injection/credential risks due to its limited scope (UI animations only). Immediate action required: upgrade Gradle tooling, migrate away from Bintray, and consolidate on modern repositories (Maven Central, Google Maven). The animation library code shows no obvious injection vulnerabilities, hardcoded secrets, or dangerous patterns.
- High · Outdated Gradle Build Tools —
build.gradle - classpath 'com.android.tools.build:gradle:3.2.1'. The project uses Gradle 3.2.1 (released in September 2018), which is significantly outdated and no longer receives security updates. This version may contain known vulnerabilities in the build system itself. Fix: Update to the latest stable version of Android Gradle Plugin (currently 8.x). Run './gradlew wrapper --gradle-version=<latest>' and update build.gradle dependencies accordingly. - High · Outdated Bintray Release Plugin —
build.gradle - classpath 'com.novoda:bintray-release:0.8.1'. The project uses Bintray Release 0.8.1 from 2018. Bintray was deprecated by JFrog and shut down on May 1, 2021. This plugin is unmaintained and poses supply chain risks. Fix: Replace with Maven Central publishing using maven-publish plugin or Sonatype OSSRH. Remove the outdated bintray-release dependency entirely. - Medium · Deprecated JCenter Repository —
build.gradle - repositories { jcenter() }. The project relies on JCenter repository, which was shut down by JFrog on May 1, 2021. While builds may still work due to fallback to google() and local caches, this is unreliable for dependency resolution and security updates. Fix: Remove jcenter() and rely exclusively on google() and mavenCentral() repositories. Update to modern repository practices. - Medium · Missing ProGuard/R8 Configuration Review —
library/proguard-rules.pro and sample/proguard-rules.pro. The project includes proguard-rules.pro files but without visible content inspection. Custom ProGuard rules could inadvertently expose sensitive information or disable important security features if misconfigured. Fix: Review and audit all ProGuard/R8 rules to ensure sensitive code is not exposed. Verify that optimization and obfuscation rules do not compromise security. - Low · No HTTPS Enforcement in README —
README.md - 'https://raw.githubusercontent.com/ybq/AndroidSpinKit/master/art/spinkit.apk'. README references raw GitHub URLs (http) for demo APK distribution. While GitHub redirects to HTTPS, explicit HTTPS URLs reduce MITM attack surface. Fix: Ensure all external URLs in documentation use HTTPS explicitly. Consider hosting APK releases through GitHub Releases rather than raw content.
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.