Docile-Alligator/Infinity-For-Reddit
A Reddit client for Android
Single-maintainer risk — review before adopting
weakest axiscopyleft license (AGPL-3.0) — review compatibility; top contributor handles 98% of recent commits…
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 1d ago
- ✓3 active contributors
- ✓AGPL-3.0 licensed
Show all 8 evidence items →Show less
- ✓CI configured
- ⚠Small team — 3 contributors active in recent commits
- ⚠Single-maintainer risk — top contributor 98% of recent commits
- ⚠AGPL-3.0 is copyleft — check downstream compatibility
- ⚠No test directory detected
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
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/docile-alligator/infinity-for-reddit)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/docile-alligator/infinity-for-reddit on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: Docile-Alligator/Infinity-For-Reddit
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/Docile-Alligator/Infinity-For-Reddit 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 — Single-maintainer risk — review before adopting
- Last commit 1d ago
- 3 active contributors
- AGPL-3.0 licensed
- CI configured
- ⚠ Small team — 3 contributors active in recent commits
- ⚠ Single-maintainer risk — top contributor 98% of recent commits
- ⚠ AGPL-3.0 is copyleft — check downstream compatibility
- ⚠ 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 Docile-Alligator/Infinity-For-Reddit
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/Docile-Alligator/Infinity-For-Reddit.
What it runs against: a local clone of Docile-Alligator/Infinity-For-Reddit — 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 Docile-Alligator/Infinity-For-Reddit | Confirms the artifact applies here, not a fork |
| 2 | License is still AGPL-3.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 ≤ 31 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of Docile-Alligator/Infinity-For-Reddit. If you don't
# have one yet, run these first:
#
# git clone https://github.com/Docile-Alligator/Infinity-For-Reddit.git
# cd Infinity-For-Reddit
#
# 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 Docile-Alligator/Infinity-For-Reddit and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "Docile-Alligator/Infinity-For-Reddit(\\.git)?\\b" \\
&& ok "origin remote is Docile-Alligator/Infinity-For-Reddit" \\
|| miss "origin remote is not Docile-Alligator/Infinity-For-Reddit (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(AGPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"AGPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is AGPL-3.0" \\
|| miss "license drift — was AGPL-3.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 "app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java" \\
&& ok "app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java" \\
|| miss "missing critical file: app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java"
test -f "app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java" \\
&& ok "app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java" \\
|| miss "missing critical file: app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java"
test -f "app/src/main/java/ml/docilealligator/infinityforreddit/NetworkModule.java" \\
&& ok "app/src/main/java/ml/docilealligator/infinityforreddit/NetworkModule.java" \\
|| miss "missing critical file: app/src/main/java/ml/docilealligator/infinityforreddit/NetworkModule.java"
test -f "app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java" \\
&& ok "app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java" \\
|| miss "missing critical file: app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java"
test -f "app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java" \\
&& ok "app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java" \\
|| miss "missing critical file: app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.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 31 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1d)"
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/Docile-Alligator/Infinity-For-Reddit"
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
Infinity for Reddit is a native Android Reddit client written primarily in Java (5.4 MB) with Kotlin components, offering an ad-free browsing experience with a clean Material Design UI. It bypasses Google Play Services dependencies via a Patreon build variant and implements features like video link fetching, post moderation, comment threading, and local caching through Room database (RedditDataRoomDatabase.java). Monolithic Android app: app/src/main/java/ml/docilealligator/infinityforreddit/ contains domain logic (Post, Comment, User entities), API clients (NetworkModule.java for Retrofit/OkHttp), DI (AppComponent.java), and UI layers; app/src/main/res/ holds layout XMLs; Room database abstractions live in RedditDataRoomDatabase.java with comment caching in PostDetailCommentsCache.kt. ProxyEnabledGlideModule.java handles image loading via Glide.
👥Who it's for
Android users who want a lightweight, ad-free Reddit client alternative; contributors interested in native Android development, OAuth2 Reddit API integration, and maintaining an open-source mobile app without corporate ad infrastructure.
🌱Maturity & risk
Production-ready and actively maintained—version 8.2.1 (versionCode 217) with CI/CD via GitHub Actions (build.yml, codeql-analysis.yml), Room database persistence, Dagger 2 DI setup (AppComponent.java, AppModule.java), and ProGuard obfuscation configured. Recent Kotlin adoption alongside legacy Java suggests ongoing modernization rather than abandonment.
Single-maintainer project (Docile-Alligator) with dependency on Reddit's API stability; 5+ year old codebase mixing Java and Kotlin increases refactoring friction. No visible test coverage in file structure (no test/ directories shown) despite network-heavy operations (VideoLinkFetcher.java, FetchPostFilterAndConcatenatedSubredditNames.java). minSdk 21 limits Android 5.0 support, and the Patreon variant creates two maintenance tracks.
Active areas of work
Active development with Kotlin adoption (APIResult.kt, ActionState.kt, AutoRemovalLinkedHashMap.kt added), moderation features (CommentModerationActionHandler.kt, PostModerationActionHandler.kt), and caching optimization (PostDetailCommentsCacheManager.kt). GitHub Discussions enabled for ideas and Q&A; dependabot.yml suggests automated dependency tracking.
🚀Get running
Check README for instructions.
Daily commands:
./gradlew build compiles all variants; ./gradlew installDebug deploys debug APK to connected device/emulator; ./gradlew assembleRelease creates unsigned release APK (minifiedRelease variant with ProGuard enabled). Use adb logcat to tail logs during testing.
🗺️Map of the codebase
app/src/main/java/ml/docilealligator/infinityforreddit/Infinity.java— Application entry point and global state management — initializes the DI container, caching, and Reddit OAuth flow.app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java— Dagger dependency injection component — defines all singletons and module bindings required by the app.app/src/main/java/ml/docilealligator/infinityforreddit/NetworkModule.java— Network configuration and Retrofit/OkHttp setup for Reddit API calls — critical for all API communication.app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java— Room database configuration and all entity DAOs — persists accounts, posts, comments, and user data.app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java— Main UI container and navigation orchestration — manages tab switching, drawer, and fragment lifecycle.app/src/main/java/ml/docilealligator/infinityforreddit/account/AccountRepository.java— Account data access abstraction — bridges Reddit API calls and local Room persistence for user accounts.app/build.gradle— Build configuration, dependency versions, and Android SDK levels — controls compileSdk, targetSdk, and all library versions.
🛠️How to make changes
Add a new main UI screen / tab
- Create a Fragment class in app/src/main/java/ml/docilealligator/infinityforreddit/fragments/ that extends Fragment and binds a layout. (
app/src/main/java/ml/docilealligator/infinityforreddit/fragments/{NewFragment}.java) - Create a ViewModel in app/src/main/java/ml/docilealligator/infinityforreddit/{feature}/ to manage state with LiveData. (
app/src/main/java/ml/docilealligator/infinityforreddit/{feature}/{FeatureName}ViewModel.java) - Register the Fragment in the navigation graph or tab adapter referenced by MainActivity. (
app/src/main/java/ml/docilealligator/infinityforreddit/activities/MainActivity.java) - Add layout XML file for your fragment in app/src/main/res/layout/fragment_{feature_name}.xml. (
app/src/main/res/layout/fragment_{feature_name}.xml)
Add a new Reddit API call and sync to Room
- Define API service interface method in app/src/main/java/ml/docilealligator/infinityforreddit/apis/ (e.g., RedditAPI.java). (
app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java) - Create or update a Room Entity and DAO in app/src/main/java/ml/docilealligator/infinityforreddit/account/ or relevant domain. (
app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java) - Create a Repository class that calls the API, parses the response, and inserts into Room. (
app/src/main/java/ml/docilealligator/infinityforreddit/account/{Domain}Repository.java) - Expose a LiveData or Flow method in the Repository and consume it in your ViewModel and Fragment. (
app/src/main/java/ml/docilealligator/infinityforreddit/{feature}/{FeatureName}ViewModel.java)
Add a new post/comment action (vote, award, delete, etc.)
- Add the API call method to the appropriate API service (RedditAPI) in app/src/main/java/ml/docilealligator/infinityforreddit/apis/. (
app/src/main/java/ml/docilealligator/infinityforreddit/apis/RedditAPI.java) - If a new post-level action, add it to PostModerationActionHandler; if comment-level, add to CommentModerationActionHandler. (
app/src/main/java/ml/docilealligator/infinityforreddit/PostModerationActionHandler.kt) - Update the Post or Comment entity and DAO in RedditDataRoomDatabase to reflect state changes (e.g., votes, saved flag). (
app/src/main/java/ml/docilealligator/infinityforreddit/RedditDataRoomDatabase.java) - Trigger the action handler from the adapter click listener and update the UI via LiveData notifying subscribers. (
app/src/main/java/ml/docilealligator/infinityforreddit/adapters/{PostAdapter or CommentAdapter}.java)
Add a new user preference / setting
- Add a preference entry to app/src/main/res/xml/preferences.xml (or similar) for SettingsActivity. (
app/src/main/res/xml/preferences.xml) - Define a String or Int constant key in a Preferences utility class and add
🪤Traps & gotchas
OAuth2 token refresh logic (not shown but required for Reddit API)—ensure RedditDataRoomDatabase persists refresh tokens securely. ProxyEnabledGlideModule means image loading respects app proxy settings, which may conflict with VPN. EventBusIndex APT code generation requires annotationProcessorOptions setup in build.gradle—mismatch causes silent event routing failures. Patreon vs. Play Store build variants (debug suffix in debug builds, two release flavors) must be kept in sync or features diverge. Room database migrations not visible—schema changes require explicit migration classes or app crashes on upgrade.
💡Concepts to learn
- Dagger 2 Dependency Injection — AppComponent.java and AppModule.java orchestrate object graph creation for network clients, database DAOs, and repositories—misunderstanding DI scope causes memory leaks and singleton conflicts.
- Room Persistence Library — RedditDataRoomDatabase.java abstracts SQLite with type-safe DAOs; critical for understanding how posts, comments, and user data are cached offline.
- OAuth 2.0 (Reddit API) — Infinity authenticates against Reddit's OAuth2 endpoints to fetch feeds and user data; token refresh logic must be understood to debug auth failures.
- EventBus with Annotation Processing — javaCompileOptions.annotationProcessorOptions generates EventBusIndex at compile-time for decoupled event dispatch between fragments/activities—fails silently if index generation is misconfigured.
- ProGuard Code Obfuscation — minifiedRelease build type uses ProGuard (proguard-rules.pro) to shrink release APK size; incorrect rules break reflection-based libraries like Retrofit or Room.
- Glide Image Loading with Custom Modules — ProxyEnabledGlideModule.java customizes Glide behavior for proxy support and memory-efficient downsampling; misuse causes OOM on large feeds.
- Android ViewBinding — buildFeatures.viewBinding enables type-safe layout inflation instead of findViewById(); eliminates boilerplate in activities/fragments used throughout Infinity.
🔗Related repos
QuantumBadger/RedReader— Alternative lightweight Reddit client for Android, similar ad-free ethos and offline-first design patterns.jmToggle/Slide-for-Reddit— Another popular open-source Reddit client for Android, useful for comparing API client patterns and UI/UX approaches.foxanastudio/Infinity-For-Reddit-iOS— Official iOS port of Infinity for Reddit mentioned in README—reference for cross-platform architecture and shared API layer design.square/retrofit— Dependency used in NetworkModule.java for REST API client generation—essential to understand for modifying Reddit API endpoints.google/dagger— DI framework powering AppComponent.java and AppModule.java—core to understanding how services and repositories are wired.
🪄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 unit tests for APIResult.kt and DataLoadState.kt state management
The repo has core state management classes (APIResult.kt, DataLoadState.kt, ActionState.kt, NetworkState.java) but no visible test coverage. These are critical for handling API responses and UI state transitions. Adding unit tests would catch regressions in state handling, especially for error cases and edge states that are common in Reddit API integrations.
- [ ] Create app/src/test/java/ml/docilealligator/infinityforreddit/ directory structure
- [ ] Add unit tests for APIResult.kt covering success, error, and loading states
- [ ] Add unit tests for DataLoadState.kt and ActionState.kt with state transitions
- [ ] Add test dependencies (JUnit 4, Mockito) to app/build.gradle
- [ ] Ensure tests cover nullable types and edge cases in Kotlin sealed classes
Implement automated UI tests for CommentActivity.java and PostDetailCommentsCache.kt
Comment handling is a core feature (CommentActivity.java, CommentModerationActionHandler.kt, PostDetailCommentsCache.kt exist) but there's no evidence of instrumented tests. Reddit's nested comment threading is complex; UI tests would prevent regressions in comment rendering, caching, and moderation actions across different data states.
- [ ] Create app/src/androidTest/java/ml/docilealligator/infinityforreddit/ directory
- [ ] Add instrumented tests for CommentActivity comment loading and rendering
- [ ] Add tests for PostDetailCommentsCacheManager.kt cache hit/miss scenarios
- [ ] Add Espresso dependencies to app/build.gradle if missing
- [ ] Create test fixtures for mock Reddit comment API responses
Create GitHub Actions workflow for Kotlin linting and code quality checks
The repo has mixed Java/Kotlin codebase (AccountDaoKt.kt, AppAuthLoginActivity.kt alongside Java files) and uses Kotlin compiler settings, but .github/workflows only has build.yml and codeql-analysis.yml. A dedicated Kotlin linting workflow (using detekt or ktlint) would catch code style issues, complexity problems, and potential bugs early, improving code consistency across Java/Kotlin migrations.
- [ ] Create .github/workflows/kotlin-lint.yml GitHub Action
- [ ] Add detekt or ktlint configuration file (detekt.yml or .editorconfig)
- [ ] Configure workflow to run on pull requests targeting main/master branch
- [ ] Add detekt/ktlint dependency to app/build.gradle if using detekt
- [ ] Configure annotations processor to handle @Suppress and baseline files for legacy code
🌿Good first issues
- Add unit tests for VideoLinkFetcher.java—currently no test files visible, but this class handles critical video URL extraction logic that could fail silently without coverage.: app/src/test/java/ml/docilealligator/infinityforreddit/VideoLinkFetcherTest.java
- Document Dagger 2 dependency injection setup in a DEVELOPMENT.md—AppComponent.java and AppModule.java lack inline comments explaining module responsibilities and scope bindings.: DEVELOPMENT.md
- Create PostDetailCommentsCacheManager.kt integration tests—caching logic in this Kotlin file is untested and may leak memory or serve stale data across rotations.: app/src/androidTest/java/ml/docilealligator/infinityforreddit/PostDetailCommentsCacheManagerTest.kt
⭐Top contributors
Click to expand
Top contributors
- @Docile-Alligator — 98 commits
- @tejasae-afk — 1 commits
- @Dar9586 — 1 commits
📝Recent commits
Click to expand
Recent commits
018006f— Version 8.2.1. (Docile-Alligator)ba6c370— Continue adding option to control the number of comment thread cache. (Docile-Alligator)9948982— Continue adding option to control the number of comment thread cache. (Docile-Alligator)405bc9b— Start adding option to control the number of comment thread cache. (Docile-Alligator)2ed5c76— Rename .java to .kt (Docile-Alligator)c50a4f8— Fix theme issues in CustomAlert. (Docile-Alligator)787e48c— Fix not respecting Remember Mute. (Docile-Alligator)2d8580b— Version 8.2.0. (Docile-Alligator)1c67c52— Version v8.2.0-beta1. (Docile-Alligator)a2da38e— Try fixing issues with inconsistent data in CommentsRecyclerViewAdapter. (Docile-Alligator)
🔒Security observations
The codebase shows moderate security maturity but has notable gaps. Critical issues include disabled minification in release builds and an incomplete dependency declaration that suggests file corruption. The absence of visible certificate pinning and network security configuration is concerning for an app handling Reddit authentication. The presence of a debug build variant and ProGuard configuration are positive, but insufficient hardening for the release build. The app would benefit from enabling code obfuscation, implementing certificate pinning for API communications, securing the build pipeline, and conducting regular dependency vulnerability scans. The incomplete build.gradle file requires immediate attention to verify all dependencies are present and secure.
- High · Minification Disabled in Release Build —
app/build.gradle - release buildType. The release build type has minifyEnabled set to false, which means the app is shipped without code obfuscation. This makes reverse engineering significantly easier and exposes sensitive logic, API keys, and internal implementation details. Fix: Enable minification in the release build: set minifyEnabled = true and configure proguard-rules.pro appropriately to obfuscate code while maintaining functionality. - High · Incomplete Dependency Declaration —
app/build.gradle - dependencies section. The build.gradle file contains a truncated dependency line ('implementatio' without completing the declaration), indicating the file may be incomplete or corrupted. This could mask missing security patches or vulnerable dependency versions. Fix: Complete and verify all dependency declarations. Ensure all dependencies are explicitly declared with specific versions and regularly audit for security updates. - Medium · No Security Headers Configuration Visible —
app/src/main/AndroidManifest.xml / NetworkModule.java. No evidence of security header configuration (e.g., Network Security Configuration, certificate pinning) in the visible codebase structure. Reddit client apps handling authentication tokens should implement certificate pinning. Fix: Implement Android Network Security Configuration with certificate pinning for Reddit API endpoints. Consider using libraries like Network Security Configuration or TrustKit. - Medium · Debug Build Accessible —
app/build.gradle - debug buildType. The debug build type is configured with debuggable attributes enabled by default. If debug APKs are distributed, they could expose debugging capabilities and sensitive information. Fix: Ensure debug builds are never distributed in production. Add explicit debuggable = false for release builds and implement build variant separation for public vs internal releases. - Medium · ProGuard Configuration File Present but Limited Visibility —
app/proguard-rules.pro. While proguard-rules.pro exists, without reviewing its contents, critical security classes and API handling code may not be properly protected against reverse engineering. Fix: Review and strengthen ProGuard rules to: keep sensitive API classes, obfuscate authentication logic, remove logging statements, and test the obfuscated build thoroughly. - Low · Kotlin Compiler Extension Version Hardcoded —
app/build.gradle - composeOptions. The Kotlin Compiler Extension version is pinned to 1.5.14 without apparent mechanism for automatic security updates. Fix: Regularly review and update kotlinCompilerExtensionVersion to receive security patches and compatibility improvements. - Low · Source Compatibility Above Minimum SDK —
app/build.gradle - compileOptions. The app targets Java 11 compatibility but supports minSdk 21 (Android 5.0). While not a direct vulnerability, this could introduce compatibility issues or unexpected behavior on older devices. Fix: Ensure thorough testing on minimum SDK devices. Consider if Java 11 features are necessary or if source compatibility could be lowered to match the target audience.
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.