🚀 Ship with Junie: Building Masterly with JetBrains’ AI Coding Partner
20 developers. 2 months. 1 experiment with AI.
I’m one of 20 developers worldwide selected for the Ship with Junie program by JetBrains & RevenueCat.
Over the next 4 weeks, I’ll be building Masterly — an app to track your 10,000-hour mastery journey — with Junie, JetBrains’ new AI coding partner, by my side.
This isn’t just about building an app. It’s about testing the future of developer workflows:
👉 Can AI truly act as a coding partner — not just autocomplete — and help us ship faster, smarter, and with less friction?
📑 Table of Contents
Who I Am & Why This Journey Matters
What Is Junie?
How to Get Started with Junie (Step-by-Step)
My Project: Masterly
The Mission: Build with Junie (Deep Dive)
Best Practices for Using AI as a Developer
Why This Journey Matters for Developers
What You Can Expect in This Series
Closing Thoughts
1. Who I Am & Why This Journey Matters
I’m Akshay Nandwana — Android Engineer, mentor to 1,000+ developers, and founder of the Android Engineers community.
I’ve worked with companies like Google, Zee5, and fast-growing startups, while helping developers across the world grow their careers.
Why am I excited about this?
Because the future of software isn’t just what we build — it’s how we build.
With Junie, I get to test if AI can meaningfully change a real developer workflow. And with Masterly, I get to solve my own problem of consistency in deliberate practice.
2. What Is Junie?
If you’ve tried Copilot or ChatGPT, you know AI can autocomplete code.
Junie is different — it’s a coding partner integrated directly into JetBrains IDEs.
Here’s what sets it apart:
🏗️ Project scaffolding: Generate entire project structures, not just snippets.
🎨 UI help: Works with Jetpack Compose & Compose Multiplatform.
🧩 Architecture guidance: Suggests patterns like MVVM or clean layers.
🗄️ Database/API setup: Can scaffold entities, DAOs, and API clients.
💰 Monetization ready: Plays well with tools like RevenueCat.
👉 In short: Junie moves beyond “code completion” into design, architecture, and shipping.
3. How to Get Started with Junie (Step-by-Step)
Here’s the accurate setup flow (important for DX 👇):
1. Install Your IDE
Use IntelliJ IDEA (latest), Android Studio, or another supported JetBrains IDE (2024.3.2+).
2. Install the AI Assistant Plugin
Junie depends on JetBrains’ AI Assistant framework.
Go to Settings → Plugins → Marketplace → search AI Assistant → Install.
Restart your IDE.
3. Install & Enable Junie
Go to Settings → Plugins → Marketplace → search Junie → Install.
Restart, then open via View → Tool Windows → Junie or the Junie sidebar icon.
4. Start Small
Try beginner-friendly prompts:
“Generate a Compose Multiplatform starter project.”
“Create Room database with DAO for logging sessions.”
5. Iterate & Review
Junie is powerful, but not perfect.
Always refactor + run tests.
Think of Junie as a junior dev pair programmer.
6. Best First Prompts
“Generate Jetpack Compose screen with timer and start/stop button.”
“Setup MVVM architecture with ViewModel and UseCase for logging practice sessions.”
“Integrate RevenueCat SDK with subscription paywall.”
💡 Advocate tip
Juniors → Safe scaffolding, faster learning.
Seniors → Immediate clarity on where AI saves time vs. where human judgment is irreplaceable.
4. My Project: Masterly
The idea: it takes ~10,000 hours of deliberate practice to master a skill.
The problem: most people lose track of time and progress.
🎯 Masterly helps users:
Track focused practice sessions (Android, writing, guitar… any skill).
Visualize progress with dashboards, streaks, and milestones.
Stay motivated with reminders + analytics.
Unlock Premium (RevenueCat) → sync, export, advanced analytics, themes.
Why build this?
Because I’ve seen too many devs (including myself) get lost in tutorials without measuring practice, reflection, and progress. Masterly is meant to fix that.
5. The Mission: Build with Junie (Deep Dive)
👉 Pain Point
New project setup = ~25 min.
Room database boilerplate = ~50 lines.
Compose UI scaffolding = tedious without previews.
👉 Solution with Junie
Let AI handle scaffolding → I focus on UX and business logic.
Example Walkthrough
Prompt:
Can you help me improve the design, user experience, code approach for my ImmersiveTimerScreen?
It should properly work on any sze of mobile screen, like portrait mode, landscape mode.
Junie output (simplified):
@Composable
fun Controls(
isRunning: Boolean,
onToggle: () -> Unit,
onCancel: () -> Unit,
onComplete: () -> Unit
) {
BoxWithConstraints(modifier = Modifier.fillMaxWidth()) {
val base = if (maxWidth < maxHeight) maxWidth else maxHeight
val smallBtn = (base * 0.14f).coerceIn(48.dp, 72.dp)
val bigBtn = (smallBtn * 1.2f).coerceIn(56.dp, 96.dp)
val spacing = (smallBtn * 0.6f).coerceIn(16.dp, 32.dp)
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.spacedBy(spacing, Alignment.CenterHorizontally),
verticalAlignment = Alignment.CenterVertically
) {
CircleButton(size = smallBtn, text = "Close", onClick = onCancel)
CircleButton(
text = if (isRunning) "Pause" else "Play",
size = bigBtn,
onClick = onToggle
)
CircleButton(size = smallBtn, text = "Done", onClick = onComplete)
}
}
}
@Composable
fun CircleButton(size: Dp = 56.dp, text: String, onClick: () -> Unit) {
Box(
contentAlignment = Alignment.Center,
modifier = Modifier
.size(size)
.border(1.dp, Color(0xFF9A4DFF), CircleShape)
.background(Color.Transparent, CircleShape)
.semantics { contentDescription = text; role = Role.Button }
.clickable(onClick = onClick)
) {
Text(
text = text,
color = Color(0xFFCCCCCC),
fontWeight = FontWeight.Medium
)
}
}
@Composable
fun TimerText(totalSeconds: Int) {
val hours = totalSeconds / 3600
val minutes = (totalSeconds % 3600) / 60
val secs = totalSeconds % 60
BoxWithConstraints(modifier = Modifier.fillMaxWidth()) {
val isLandscape = maxWidth > maxHeight
val density = LocalDensity.current
// Base on the smaller dimension for consistent sizing
val base = if (maxWidth < maxHeight) maxWidth else maxHeight
val valueDp = (base * if (isLandscape) 0.22f else 0.28f).coerceIn(48.dp, 120.dp)
val labelDp = (valueDp * 0.12f).coerceIn(10.dp, 16.dp)
val spacing = (valueDp * 0.14f).coerceIn(8.dp, 20.dp)
val valueSp = with(density) { valueDp.toSp() }
val labelSp = with(density) { labelDp.toSp() }
if (isLandscape) {
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceEvenly,
verticalAlignment = Alignment.CenterVertically
) {
FlipBlock(value = hours.pad2(), label = "HOUR", valueFontSize = valueSp, labelFontSize = labelSp)
FlipBlock(value = minutes.pad2(), label = "MIN", valueFontSize = valueSp, labelFontSize = labelSp)
FlipBlock(value = secs.pad2(), label = "SEC", valueFontSize = valueSp, labelFontSize = labelSp)
}
} else {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(spacing)
) {
FlipBlock(value = hours.pad2(), label = "HOUR", valueFontSize = valueSp, labelFontSize = labelSp)
FlipBlock(value = minutes.pad2(), label = "MIN", valueFontSize = valueSp, labelFontSize = labelSp)
FlipBlock(value = secs.pad2(), label = "SEC", valueFontSize = valueSp, labelFontSize = labelSp)
}
}
}
}
✅ Result: A working timer UI in minutes.
⚠️ My part: add animations, polish state handling, improve accessibility.
DX Metrics
Project setup → 25 min → 6 min (20 min saved).
Room DAO scaffolding → ~50 lines generated automatically.
Compose UI → ~60% of boilerplate skipped, I worked on design.
Cognitive load → No tab-switching to docs → stayed in flow.
ChatGPT flagged one real issue: I was using BoxWithConstraints(fillMaxWidth())
while comparing maxWidth
vs maxHeight
. That can be unconstrained vertically, so orientation math becomes flaky. Switching to fillMaxSize()
(or using LocalConfiguration
) fixed it. It also suggested ripple + focus states, theme colors instead of hex values, and monospace digits—small changes that made the screen feel ‘production’ rather than ‘prototype’
Best Practices
Iterative prompts beat big asks → scaffold first, refine second.
Review like PRs → AI code is a draft, not production.
Own the architecture → Don’t outsource decisions to AI.
👉 If you had Junie today, what’s the first task you’d delegate? Setup? UI scaffolds? API clients?
Drop your answer — I’ll include community feedback in the next post.
6. Best Practices for Using AI as a Developer
From my early weeks, these stand out:
🛠️ AI is an assistant, not an autopilot → You still own product vision.
✅ Refactor everything → Treat AI like a junior dev’s PR.
🎯 Stay user-focused → Let AI cut boilerplate; you solve problems.
📈 Iterate in small steps → Smaller prompts = better accuracy.
7. Why This Journey Matters for Developers
For years, devs faced trade-offs:
Boilerplate vs. features.
Setup vs. shipping.
With tools like Junie:
⚡ Setup → instant.
⚡ Boilerplate → reduced.
⚡ Focus → problem-solving + UX.
This isn’t just about Masterly. It’s about testing whether AI belongs in the everyday dev workflow.
8. What You Can Expect in This Series
Weekly Deep Dives
Week 1 — What is Junie? Hands-on exploration, strengths & blind spots
Week 2 — Compose a Multiplatform setup with Junie
Week 3 — Skill Dashboard & Timer (UI)
Week 4 — Architecture & Database (Room/SQLDelight)
Week 5 — Monetization with RevenueCat (deep dive in Part 2)
Week 6+ — Iterations, polish, launch prep
Also, in every post
🧑💻 Real code: Junie scaffolds vs. my refactors
🎥 YouTube demos: See Junie in action
💬 Community voice: Wins, struggles, and your feedback
9. Closing Thoughts
This isn’t just a side project.
It’s a live test of a belief I’ve always had:
👉 Practice makes you better. Projects make you unforgettable.
With Masterly, I’m solving my own problem of consistency.
With Junie, I’m testing if AI can truly become a coding partner.
Over the next 4 weeks, I’ll share:
✅ Wins that save hours.
✅ Struggles where AI falls short.
✅ Lessons you can reuse in your projects.
Next up → Deep dive into Junie: where it shines, and where it stumbles, in real Android/KMP workflows.
Stay tuned 🚀
🔑 TL;DR
Selected as 1 of 20 devs in Ship with Junie by JetBrains & RevenueCat.
Building Masterly: an app to track your 10,000-hour mastery journey.
Junie = not just autocomplete, but a JetBrains AI coding partner for scaffolding, UI, DB, and monetization.
Weekly deep dives → Compose, KMP, RevenueCat, AI DX lessons.
Expect real wins + honest struggles — documented in blogs + YouTube.
🔮 Coming up next → A hands-on deep dive into Junie: Compose Multiplatform scaffolding + Room database setup, with DX metrics.
What’s Next
💬 I’d love to hear from you — if you had Junie in your IDE today, what’s the very first task you’d delegate?
Project setup, UI scaffolds, or API clients?
Drop a comment or DM me — I’ll highlight real community insights in the next blog.
👉 Follow along here:
Subscribe to Substack for weekly write-ups
Connect on LinkedIn for quick takeaways
Watch on YouTube for live demos
Later in the series → Monetization with RevenueCat: offerings, entitlements, paywall UI, and purchase flow (Part 2).