ANDROIDANDROID APP

Innerly

"An AI that reads your week and shows you patterns you missed."

AndroidKotlinJetpack ComposeRoomHiltClaude APIOpenMeteoWorkManager
Innerly

Android · Kotlin · Jetpack Compose · Room

0
Entity types extracted
0
Encrypted preferences
0
Collision detection
0
Weather context

OVERVIEW

|

Journaling apps demand effort when users have nothing to say. Mood trackers request ratings without context. Neither captures the texture of a real week, the recurring frustrations, emerging skills, half-formed ideas, and pattern of decisions. Most people stop using these apps within two weeks because the input-to-insight ratio is too low.

|

An Android app where each journal entry is processed by an AiDetectionPipeline that sends it to Claude and extracts structured entities, Goals (with emotional charge and pressure scores), Ideas (with dormancy tracking), Decisions (with recorded fear and hope), Skills (with evidence snippets), and Threads (recurring themes). An IdeaCollision system compares each new idea against recent entries and surfaces unexpected connections. A ContextCapsuleService attaches real weather from OpenMeteo to every entry.

|

A reflection companion that generates insight from sparse data, users get meaningful observations about their patterns without needing to write elaborate journal entries.

KEY FEATURES

AiDetectionPipeline

Sends each journal entry to Claude with a strict JSON-only system prompt. Extracts Goals (emotional_charge, type), Ideas (title), Decisions (fear, hope), Skills (category: TECHNICAL/CREATIVE/SOCIAL/PHYSICAL, evidence_snippet), and key_themes. Results are upserted into Room with mention counts and related entry IDs.

IdeaCollision Detection

After creating a new Idea, the pipeline compares it against the 5 most recent ideas via a second Claude call. If a meaningful connection is found, an IdeaCollision record is inserted with a one-sentence connectionExplanation, surfacing links the user never consciously made.

Context Capsule Service

ContextCapsuleService builds a ContextSnapshot for each entry: date, day ordinal, season, current weather (from OpenMeteo getCurrentWeather), and a this_week_in_history fact from WeekHistoryFacts.

Decision Tracking

Decisions record fear and hope at the time of writing. A later update records the actual outcome and whether the initial prediction was accurate, creating a personal accountability loop.

Encrypted Preferences

EncryptedSharedPreferences with AES256-GCM via Android Keystore protects all sensitive user settings. Plain SharedPreferences are used only for non-sensitive UI preferences.

HomeViewModel Aggregation

Combines StateFlows from 7 repositories: top 3 goals by pressureScore, open decisions awaiting outcome, active IdeaCollisions, dormant ideas (status=DORMANT && days≥30), skills inventory, momentum snapshot, and weekly decision counts.

TECH STACK

Tap to see the reasoning

BUILD TIMELINE

Phase 01

Hilt Architecture & Room

Set up AppModule with Room database (innerly.db), all 9 DAOs, ClaudeService, EncryptedSharedPreferences (AES256-GCM), and plain SharedPreferences. Defined all Room entities.

CHALLENGES & SOLUTIONS

Early versions flagged too many weak connections as meaningful. The fix was a high-bar collision prompt: Claude returns collision:false for superficial connections and collision:true only when the link is genuinely surprising, with a mandatory one-sentence connectionExplanation. The quality bar makes the feature useful rather than noisy.

Goals, Ideas, and Decisions all store relatedEntryIds as JSON-serialised UUID arrays rather than Rooms @Relation junction tables. This trades JOIN flexibility for simplicity, the app never needs to query across entities in a JOIN; it only needs to display the list of related entry IDs on the detail screen.

LET'S BUILD SOMETHING TOGETHER

I'm always open to discussing new projects, partnerships, or just a good idea.