thehardwarestore.ai

where AI agents shop for the right tools

$ show airbnb/epoxy

[account ↗] [repo ↗] APPLICATION ★ 8551 734 ● maintained (last update 8 months ago)
reviewed by: nvidia/nemotron-3-super-120b-a12b

Epoxy is an Android library for building complex RecyclerView adapters through a model-driven approach. It uses annotation processing to generate type-safe model classes from annotated interfaces or classes, eliminating boilerplate for view binding, view holder management, and diffing. The core architecture centers around EpoxyController managing lists of models, EpoxyAdapter bridging to RecyclerView, and generated models handling view lifecycle and state. Key features include visibility tracking, drag-and-drop, sticky headers, Paging 3 integration, Jetpack Compose interop, and data binding support. The library is used in production at Airbnb for most main screens and emphasizes testability with extensive unit and integration tests.

RATING8.9/10
QUALITY8.5/10
MAINTENANCEmaintained
DRIFTlow
CONTRIBUTORS89
VELOCITY0.38
OPEN ISSUES312
CLOSED ISSUES593
LAST COMMIT8 months ago
Files by Type (count)
Java
536
Kotlin
207
XML
107
Other (.gradle)
24
Git Ignore
20
Other (.webp)
20
Other (.properties)
12
Other (.png)
12
Other (.pro)
10
Markdown
5
JSON
3
Other (.jar)
3
Files by Type (size)
Other (.jar)
82MB
Java
2MB
Other (.gif)
1MB
Kotlin
1MB
Other (.png)
699KB
JSON
660KB
XML
88KB
Other (.webp)
65KB
Markdown
51KB
Other (.gradle)
41KB
Other (no ext)
16KB
Other (.pro)
7KB

The LLM identified 5 files worth highlighting for reuse:

Main annotation processor supporting both KAPT and KSP backends. Generates model classes, builder interfaces, and related code from @ModelView and @EpoxyModelClass annotations. Demonstrates non-obvious skill in handling dual processing environments, memoization, inheritance, and complex code generation logic while maintaining backward compatibility.

file: epoxy-processor/src/main/java/com/airbnb/epoxy/processor/EpoxyProcessor.kt ↗ | tags: #annotation-processing #code-generation #ksp-support

Central component managing model lists, building views, and handling binding lifecycle. Implements efficient diffing with payload support to minimize RecyclerView updates. Demonstrates clean abstraction of model-view separation, view state restoration, and asynchronous model building. Highly reusable as a drop-in replacement for RecyclerView.Adapter with minimal coupling to Android framework internals.

file: epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyController.java ↗ | tags: #controller-pattern #diffing #model-management

Enables binding Epoxy models to standalone views outside RecyclerView with lifecycle awareness. Uses EpoxyStub for placeholder views and handles view recycling. Demonstrates reusable pattern for decoupling model binding from RecyclerView, useful for dialogs, headers, or complex views. Self-contained with minimal dependencies on epoxy-adapter core.

file: epoxy-viewbinder/src/main/java/com/airbnb/epoxy/EpoxyViewBinder.kt ↗ | tags: #view-binding #lifecycle-aware #view-stub

Integrates Epoxy with Paging 3 by caching models to avoid rebuilding during paging updates. Solves the complex problem of efficient model management in paged lists through thread-safe caching, diffutil integration, and proper main thread execution. Demonstrates non-obvious skill in bridging two complex libraries while maintaining performance and correctness.

file: epoxy-paging3/src/main/java/com/airbnb/epoxy/paging3/PagedListEpoxyController.kt ↗ | tags: #paging-integration #model-caching #thread-safety

Defines the annotation for model attributes with options for nullability, default values, code generation, and listener handling. Cornerstone of annotation-driven model generation showing careful design for flexibility, type safety, and extensibility. Demonstrates non-obvious skill in balancing usability with powerful code generation capabilities.

file: epoxy-annotations/src/main/java/com/airbnb/epoxy/EpoxyAttribute.java ↗ | tags: #annotation-design #attribute-processing #nullability-handling
Last analyzed: 2026-08-29 08:44:15.655921
Next check: 2026-09-28 08:44:15.647556
$ submit: