wasabeef/glide-transformations
An Android transformation library providing a variety of image transformations for Glide.
Stale — last commit 4y ago
weakest axislast commit was 4y ago; no tests detected…
no tests detected; no CI workflows detected…
Documented and popular — useful reference codebase to read through.
last commit was 4y ago; no CI workflows detected
- ✓13 active contributors
- ✓Apache-2.0 licensed
- ⚠Stale — last commit 4y ago
Show all 6 evidence items →Show less
- ⚠Single-maintainer risk — top contributor 86% 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/wasabeef/glide-transformations)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/wasabeef/glide-transformations on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: wasabeef/glide-transformations
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/wasabeef/glide-transformations 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 4y ago
- 13 active contributors
- Apache-2.0 licensed
- ⚠ Stale — last commit 4y ago
- ⚠ Single-maintainer risk — top contributor 86% 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 wasabeef/glide-transformations
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/wasabeef/glide-transformations.
What it runs against: a local clone of wasabeef/glide-transformations — 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 wasabeef/glide-transformations | 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 main exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 1552 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of wasabeef/glide-transformations. If you don't
# have one yet, run these first:
#
# git clone https://github.com/wasabeef/glide-transformations.git
# cd glide-transformations
#
# 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 wasabeef/glide-transformations and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "wasabeef/glide-transformations(\\.git)?\\b" \\
&& ok "origin remote is wasabeef/glide-transformations" \\
|| miss "origin remote is not wasabeef/glide-transformations (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 main >/dev/null 2>&1 \\
&& ok "default branch main exists" \\
|| miss "default branch main no longer exists"
# 4. Critical files exist
test -f "transformations/src/main/java/jp/wasabeef/glide/transformations/BitmapTransformation.java" \\
&& ok "transformations/src/main/java/jp/wasabeef/glide/transformations/BitmapTransformation.java" \\
|| miss "missing critical file: transformations/src/main/java/jp/wasabeef/glide/transformations/BitmapTransformation.java"
test -f "transformations/build.gradle" \\
&& ok "transformations/build.gradle" \\
|| miss "missing critical file: transformations/build.gradle"
test -f "example/src/main/java/jp/wasabeef/example/glide/MainActivity.kt" \\
&& ok "example/src/main/java/jp/wasabeef/example/glide/MainActivity.kt" \\
|| miss "missing critical file: example/src/main/java/jp/wasabeef/example/glide/MainActivity.kt"
test -f "transformations/src/main/java/jp/wasabeef/glide/transformations/gpu/GPUFilterTransformation.java" \\
&& ok "transformations/src/main/java/jp/wasabeef/glide/transformations/gpu/GPUFilterTransformation.java" \\
|| miss "missing critical file: transformations/src/main/java/jp/wasabeef/glide/transformations/gpu/GPUFilterTransformation.java"
test -f "transformations/src/main/java/jp/wasabeef/glide/transformations/internal/FastBlur.java" \\
&& ok "transformations/src/main/java/jp/wasabeef/glide/transformations/internal/FastBlur.java" \\
|| miss "missing critical file: transformations/src/main/java/jp/wasabeef/glide/transformations/internal/FastBlur.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 1552 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1522d)"
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/wasabeef/glide-transformations"
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
An Android transformation library that wraps Glide's image loading framework to provide a collection of composable image transformations (blur, crop, rounded corners, grayscale, GPU filters, etc.) without users having to write custom transformation code. It reduces boilerplate for common image effects through a simple, chainable API using Glide's MultiTransformation pattern. Simple library structure: core transformation classes live in the main module (likely under transformations/ subdirectory, not shown in truncated list), example/ contains a working demo Android app using MainAdapter.kt and MainActivity.kt to showcase all transformations, and gradle-based build system. No monorepo—single focused module with optional GPU filter dependencies.
👥Who it's for
Android developers building apps with Glide who need to apply image effects (blur, filters, cropping, masking) at load time without writing custom Glide Transformation classes or external image processing libraries. Also useful for teams standardizing on a shared transformation library across multiple apps.
🌱Maturity & risk
Mature and stable: published on Maven Central (v4.3.0), widely used in production (evidenced by real app examples like Ameba Ownd in README), but shows signs of slower maintenance—Kotlin version is small (8KB vs 69KB Java), and build config references deprecated JCenter. CI/test presence not visible in file list. Likely production-ready but not actively evolved.
Low-to-moderate risk: tight coupling to Glide 4.11.0 means breaking Glide updates could require quick patches; optional GPUImage dependency (v2.1.0) adds transitive risk but is optional. Single-author risk (wasabeef) is evident from repo structure. No visible test files in the provided file list is concerning. Last commit recency unknown but Kotlin code presence suggests some recent activity.
Active areas of work
Build configuration shows recent gradle migration (4.2.0-beta04), Kotlin 1.3.72 integration (evidenced by Ext.kt in example), and a TODO comment about JCenter sunset (May 1st migration) suggesting maintainers are aware of deprecations but not actively aggressively patching. No recent major feature additions visible—library is in maintenance mode.
🚀Get running
Clone the repo: git clone https://github.com/wasabeef/glide-transformations.git && cd glide-transformations. Sync gradle: ./gradlew clean build. To run the example app: ./gradlew example:installDebug (requires connected Android device or emulator). Gradle wrapper is provided, so no external Android toolchain installation needed.
Daily commands:
For library: ./gradlew build produces the .aar. For example app: connect Android device/emulator, then ./gradlew example:installDebug && adb shell am start -n jp.wasabeef.example.glide/.MainActivity to launch. No dev server—this is a compiled library.
🗺️Map of the codebase
transformations/src/main/java/jp/wasabeef/glide/transformations/BitmapTransformation.java— Base abstract class for all transformations; defines the contract that every transformation must implement and handle bitmap caching/hashingtransformations/build.gradle— Core library build configuration; declares Glide and GPUImage dependencies that all transformations rely onexample/src/main/java/jp/wasabeef/example/glide/MainActivity.kt— Primary demo entry point showing how to apply transformations with Glide; essential reference for integration patternstransformations/src/main/java/jp/wasabeef/glide/transformations/gpu/GPUFilterTransformation.java— Foundation for all GPU-accelerated filters; manages shader compilation and GPU texture rendering pipelinetransformations/src/main/java/jp/wasabeef/glide/transformations/internal/FastBlur.java— Performance-critical blur implementation; heavily used by BlurTransformation and other filtersbuild.gradle— Root build configuration managing Kotlin, Glide, and GPUImage versions across all modulesREADME.md— Primary documentation for library usage, installation, and transformation catalog; required context for any contribution
🛠️How to make changes
Add a New CPU Bitmap Transformation
- Create a new class in transformations/src/main/java/jp/wasabeef/glide/transformations/ extending BitmapTransformation (
transformations/src/main/java/jp/wasabeef/glide/transformations/YourNewTransformation.java) - Implement transform(Bitmap) method using Android Canvas/Paint or bitmap pixel manipulation (
transformations/src/main/java/jp/wasabeef/glide/transformations/YourNewTransformation.java) - Override updateDiskCacheKey() to include all configuration parameters (e.g., radius, color) in the hash to avoid cache collisions (
transformations/src/main/java/jp/wasabeef/glide/transformations/YourNewTransformation.java) - Add test case in transformations/src/androidTest/java/jp/wasabeef/glide/transformations/ verifying output bitmap (
transformations/src/androidTest/java/jp/wasabeef/glide/transformations/ApplicationTest.java) - Reference the new transformation in example/src/main/java/jp/wasabeef/example/glide/MainAdapter.kt with a demo list entry (
example/src/main/java/jp/wasabeef/example/glide/MainAdapter.kt)
Add a New GPU Filter Transformation
- Create a new class in transformations/src/main/java/jp/wasabeef/glide/transformations/gpu/ extending GPUFilterTransformation (
transformations/src/main/java/jp/wasabeef/glide/transformations/gpu/YourGPUFilter.java) - In the constructor, call addFilter() to apply the GPUImage filter chain; configure shader uniforms (brightness, contrast, etc.) (
transformations/src/main/java/jp/wasabeef/glide/transformations/gpu/YourGPUFilter.java) - Override updateDiskCacheKey() with all filter parameters to ensure unique cache keys for different configs (
transformations/src/main/java/jp/wasabeef/glide/transformations/gpu/YourGPUFilter.java) - Add a demo entry in MainAdapter.kt with .transform() chaining to apply the new filter (
example/src/main/java/jp/wasabeef/example/glide/MainAdapter.kt)
Chain Multiple Transformations
- In MainActivity or an Activity/Fragment, import MultiTransformation from Glide (com.bumptech.glide.load.MultiTransformation) (
example/src/main/java/jp/wasabeef/example/glide/MainActivity.kt) - Create MultiTransformation list: new MultiTransformation(new BlurTransformation(), new CropCircleTransformation()) (
example/src/main/java/jp/wasabeef/example/glide/MainActivity.kt) - Pass to Glide: Glide.with(context).load(imageUrl).transform(multiTransform).into(imageView) (
example/src/main/java/jp/wasabeef/example/glide/MainActivity.kt)
Optimize Blur Performance
- Choose BlurTransformation constructor parameter: use RenderScript (RSBlur) on API 21+ for GPU acceleration, FastBlur for older APIs (
transformations/src/main/java/jp/wasabeef/glide/transformations/BlurTransformation.java) - Set blur radius to balance quality vs. performance; higher radius = slower (typically 8–25 is practical) (
transformations/src/main/java/jp/wasabeef/glide/transformations/BlurTransformation.java) - Enable Glide's disk cache to avoid re-blurring: .diskCacheStrategy(DiskCacheStrategy.ALL) (
example/src/main/java/jp/wasabeef/example/glide/MainAdapter.kt)
🪤Traps & gotchas
- Glide version coupling—the library targets Glide 4.11.0; using a different Glide version in your app can cause Transform interface mismatches at runtime. 2) GPUImage is optional but some transformations (ToonFilterTransformation, SepiaFilterTransformation, etc.) require it and will ClassNotFoundException at runtime if not included. 3) ProGuard/R8 obfuscation can break Glide's metadata—example/proguard-rules.pro should be consulted before shipping. 4) The library performs image processing synchronously on Glide's thread pool—very large images or chained transformations can cause jank.
🏗️Architecture
💡Concepts to learn
- Glide Transform<Bitmap> interface — Every transformation in this library is a Glide Transform implementation; understanding its transform() method signature and lifecycle is essential to extending or debugging this library
- MultiTransformation composition — This library's power comes from chaining transformations (blur → round corners → grayscale); understanding how Glide's MultiTransformation sequences them prevents performance pitfalls
- GPU image processing (GLSL shaders) — The GPU Filter transformations (ToonFilterTransformation, PixelationFilterTransformation) use GLSL shaders via android-gpuimage; understanding shader basics explains why they're optional and performance-critical
- Bitmap pooling and memory pressure — Image transformations create intermediate Bitmap objects; Glide's memory management and RequestOptions control pooling behavior, which affects OutOfMemoryError risk in this library's chained transforms
- Crop coordinate systems (corner types) — RoundedCornersTransformation and CropTransformation take CornerType enums (BOTTOM, TOP, etc.) specifying which corners to round—misunderstanding the coordinate system causes visually incorrect crops
- Grayscale color matrix transforms — GrayscaleTransformation and ColorFilterTransformation use Android ColorMatrix to modify color channels; understanding RGB weighting explains why naive grayscale produces poor visual results
- Blur radius and sampling (box/Gaussian blur) — BlurTransformation takes a radius parameter; understanding the difference between box blur (faster, blocky) and Gaussian blur (slower, smoother) informs performance tuning and visual quality tradeoffs
🔗Related repos
wasabeef/picasso-transformations— Same author's port of this library for Picasso instead of Glide—useful for projects still on Picassowasabeef/fresco-processors— Same author's transformation library for Fresco, the Facebook image library—alternative for teams using Frescobumptech/glide— The core image loading framework this library wraps; understand Glide's Transform interface and RequestOptions to extend this libraryCyberAgent/android-gpuimage— The GPU filter engine used by ToonFilterTransformation, SepiaFilterTransformation, and other GPU-based transformations—required optional dependencygoogle/material-design-android-library— Often used alongside glide-transformations in Material Design apps for consistent image styling with Material guidelines
🪄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 comprehensive unit tests for transformation classes in transformations/src/androidTest
The repo has only ApplicationTest.java in androidTest but lacks specific unit tests for individual transformation classes. Testing transformations like blur, grayscale, rotation, etc. is critical for image processing libraries. This ensures transformations work correctly across different API levels and image formats.
- [ ] Create test files in transformations/src/androidTest/java/jp/wasabeef/glide/transformations/ for each major transformation class
- [ ] Add tests covering edge cases (null inputs, extreme values, different image dimensions)
- [ ] Test GPU-based transformations separately from CPU-based ones using the gpuimage_version dependency
- [ ] Run tests with ApplicationTest.java to ensure Android instrumentation tests pass
Migrate from JCenter to Maven Central in build.gradle and publishing configuration
The build.gradle contains a TODO comment about closing JCenter on May 1st, and jcenter() is still listed in allprojects.repositories. The commented-out bintray and maven plugins indicate incomplete migration. Completing this ensures the library can be properly published and future contributors won't face deprecated repository issues.
- [ ] Remove jcenter() from allprojects.repositories in build.gradle
- [ ] Remove or update the commented bintray and android-maven-gradle-plugin classpath dependencies
- [ ] Add proper Maven Central publishing configuration (either via gradle-maven-publish-plugin or similar)
- [ ] Update README.md with new Maven Central coordinates if they differ from current ones
- [ ] Test the build process locally to ensure publishing works
Add GitHub Actions CI workflow for automated testing and release validation
The repo has GitHub issue and PR templates but no CI/CD workflow files. Given the presence of example/ and transformations/ modules with tests, a GitHub Actions workflow would automatically validate PRs, run tests on multiple API levels, and catch regressions before merge. This is critical for a widely-used transformation library.
- [ ] Create .github/workflows/android-test.yml to run unit and instrumentation tests on push/PR
- [ ] Configure the workflow to test against multiple Android API levels (21, 28, 30+)
- [ ] Add Kotlin lint/detekt checks to validate code quality given the Kotlin migrations evident in example/src/main/java/jp/wasabeef/example/glide/Ext.kt
- [ ] Optionally add a release workflow that validates builds match current Maven Central publishing setup
- [ ] Document workflow status in README.md with a badges section
🌿Good first issues
- Add unit tests for crop transformations: create example/src/test/java/jp/wasabeef/example/glide/ with JUnit 4 tests exercising CropCircleTransformation and RoundedCornersTransformation on known bitmap inputs to verify pixel-perfect output.
- Document GPU filter dependencies: add a section to README.md with a table listing which transformations require GPUImage and fail gracefully when not present, then add try-catch examples in the example app.
- Migrate from JCenter to MavenCentral: update build.gradle to remove the jcenter() repository call (already deprecated in the TODO comment) and verify all dependency resolution still works via mavenCentral() only.
⭐Top contributors
Click to expand
Top contributors
- @wasabeef — 86 commits
- @AAkira — 3 commits
- @bigeye-wg — 1 commits
- @Jason-Cooke — 1 commits
- @vecharm — 1 commits
📝Recent commits
Click to expand
Recent commits
d950f0c— Update README.md (wasabeef)9b1a986— Update README.md (wasabeef)6ba94e9— Update README.md (wasabeef)ffb6a89— Update README.md (wasabeef)a0698a3— Update README.md (wasabeef)aae95a7— Update .editorconfig (wasabeef)3803f5a— Update .editorconfig (wasabeef)118dddf— Update .gitignore (wasabeef)477ffbe— Update .gitignore (wasabeef)b33aa76— Update debug.gradle (wasabeef)
🔒Security observations
The codebase has moderate security concerns primarily related to outdated dependencies and build tools. The most critical issues are: (1) Gradle plugin, Kotlin, and Glide versions are 3+ years old and lack security patches; (2) JCenter repository dependency despite its deprecation; (3) Debug keystore checked into version control. The library itself appears to be straightforward image transformation code without apparent injection vulnerabilities or exposed secrets, but the dependency management and build configuration require immediate attention. Recommend updating all dependencies to current stable versions and removing deprecated repositories.
- High · Outdated Gradle Plugin Version —
build.gradle - classpath 'com.android.tools.build:gradle:4.2.0-beta04'. The project uses Gradle 4.2.0-beta04, which is a beta version from 2021. Beta versions may contain unpatched security vulnerabilities and lack production stability guarantees. This should be updated to a stable, current release. Fix: Update to the latest stable Android Gradle Plugin version (currently 8.x). Use a stable release, not beta versions. - High · Outdated Kotlin Version —
build.gradle - kotlin_version = '1.3.72'. Kotlin 1.3.72 is from 2020 and is significantly outdated. This version may contain known security vulnerabilities and lacks security patches available in newer releases. Fix: Update Kotlin to the latest stable version (currently 1.9.x or later). Review Kotlin release notes for security fixes. - High · Outdated Glide Dependency —
build.gradle - glide_version = '4.11.0'. Glide 4.11.0 is from 2020 and is outdated. Image loading libraries may have security vulnerabilities related to image processing, memory management, and network operations. Fix: Update to the latest stable Glide version (currently 4.15.x or later) to receive security updates and bug fixes. - Medium · JCenter Repository Deprecation —
build.gradle - jcenter() in repositories. The project configures JCenter repository which was officially shut down on May 1st, 2021. This is acknowledged in a TODO comment in build.gradle. Relying on deprecated repositories can lead to failed builds and supply chain risks. Fix: Remove all jcenter() repository references. Rely on Google's Maven repository and Maven Central only, which are maintained and secure. - Medium · Debug Keystore in Version Control —
signingConfigs/debug.keystore. The debug.keystore file is checked into the repository (signingConfigs/debug.keystore). While debug keystores are less critical than release keystores, storing any keystores in version control is poor security practice. Fix: Remove keystore files from version control. Generate them locally or via a secure build system. Add *.keystore to .gitignore. - Medium · Missing ProGuard/R8 Configuration for Release Builds —
transformations/proguard-rules.txt and example/proguard-rules.pro. The example module includes proguard-rules.pro, but transformations/proguard-rules.txt suggests incomplete or inconsistent obfuscation setup. The library should have robust configuration to protect against reverse engineering and code tampering. Fix: Ensure comprehensive ProGuard/R8 rules are applied to library builds. Use minifyEnabled true for release builds and test with R8 specifically. - Low · Outdated GPUImage Dependency —
build.gradle - gpuimage_version = '2.1.0'. GPUImage 2.1.0 is from 2019. While not a critical security library, keeping all dependencies updated reduces potential attack surface from transitive dependencies. Fix: Check for available updates to GPUImage and evaluate compatibility with latest version.
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.