Skip to content
This repository was archived by the owner on Dec 4, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ README.md merge=ours
# Files that should use custom merge strategy for app name changes
shared/src/*/res/values*/strings.xml merge=ours
fastlane/metadata/android/en-US/title.txt merge=ours
iosApp/iosApp.xcodeproj/project.pbxproj merge=ours
iosApp/Podfile merge=ours

# Allow standard merge for code files
*.kt merge
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/claude-code-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ on:
- "shared/**/*.kt"
- "core/**/*.kt"
- "lib/**/*.kt"
- "iosApp/**/*.swift"
- "androidApp/**/*.kt"
- "build.gradle.kts"
- "gradle/**"
Expand Down
21 changes: 5 additions & 16 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

## Project Overview

**Notely Capture** is a cross-platform mobile note-taking application built with Kotlin Multiplatform and Compose Multiplatform. It features advanced speech-to-text capabilities powered by OpenAI's Whisper AI for voice notes and audio transcription.
**Notely Capture** is an Android note-taking application built with Kotlin and Compose Multiplatform. It features advanced speech-to-text capabilities powered by OpenAI's Whisper AI for voice notes and audio transcription.

This is a personalized fork of the original "Notely Voice" project, focused on simplifying the UI, adding additional capture methods, focusing on Android development, and integration with Logseq and Obsidian.
This is a personalized fork of the original "Notely Voice" project, focused on simplifying the UI, adding additional capture methods, optimized for Android development, and integration with Logseq and Obsidian.

## Common Development Commands

Expand All @@ -24,7 +24,7 @@ This is a personalized fork of the original "Notely Voice" project, focused on s
# Clean build artifacts
./gradlew clean

# Build all targets (Android + iOS)
# Build Android target
./gradlew build

# Run tests
Expand Down Expand Up @@ -77,12 +77,6 @@ git merge upstream/main
# The .gitattributes file will help handle merge conflicts for renamed files
```

### iOS Development
```bash
cd iosApp
pod install
open iosApp.xcworkspace
```

### Release Workflow

Expand Down Expand Up @@ -148,7 +142,6 @@ For signed releases, configure these GitHub repository secrets:
- **`:shared`** - Main application module (Compose Multiplatform)
- **`:core:audio`** - Audio recording and processing
- **`:lib`** - Whisper C++ integration for speech recognition
- **`:iosApp`** - iOS-specific wrapper

### Dependency Injection with Koin
- Uses modular Koin setup with separate modules for different concerns
Expand Down Expand Up @@ -318,22 +311,18 @@ The project uses a modular architecture with the following key modules:
- **`:lib`** - Whisper C++ integration and JNI bindings
- **`:iosApp`** - iOS application wrapper

### Source Set Layout (Kotlin Multiplatform V2)
### Source Set Layout (Android-focused)
```
shared/src/
├── androidMain/kotlin/ # Android implementations
├── androidInstrumentedTest/ # Android integration tests
├── commonMain/kotlin/ # Shared business logic & UI
├── commonTest/kotlin/ # Shared unit tests
├── iosMain/kotlin/ # iOS implementations
├── iosTest/kotlin/ # iOS-specific tests
└── nativeInterop/cinterop/ # C interop definitions
└── commonTest/kotlin/ # Shared unit tests
```

## Prerequisites

- **Android Studio Ladybug** or newer
- **Xcode 16.1** (for iOS development)
- **JDK 17** or higher
- **Kotlin 2.2.0** or higher
- **NDK 27.0.12077973** (Android Native Development Kit)
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ check-integration:
@echo "✓ Makefile detected by Claude Code hooks" >&2
@echo " - 'make lint' target: available" >&2
@echo " - 'make test' target: available" >&2
@echo " - Project type: Kotlin Multiplatform (Android/iOS)" >&2
@echo " - Project type: Kotlin Multiplatform (Android-only)" >&2
@echo " - Build system: Gradle" >&2
@echo "" >&2
@echo "Test integration with:" >&2
Expand Down
20 changes: 8 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
[![Compose](https://img.shields.io/badge/compose-1.8.2-blue.svg?logo=jetpackcompose)](https://www.jetbrains.com/lp/compose-multiplatform)
[![API](https://img.shields.io/badge/API-21%2B-brightgreen.svg?style=flat)](https://android-arsenal.com/api?level=21)

A Personalised, cross-platform note-taking application with powerful Whisper AI Voice to Text capabilities built with Compose Multiplatform.
A personalised Android note-taking application with powerful Whisper AI Voice to Text capabilities built with Kotlin and Compose Multiplatform.

This is a Personalised fork of the original [Notely Voice](https://github.com/tosinonikute/NotelyVoice) project, focused on simplifying the UI, adding additional capture methods, focusing on Android development, and integration with Logseq and Obsidian.

Expand Down Expand Up @@ -60,7 +60,7 @@ Download the latest APK files directly from [GitHub Releases](https://github.com

### General
🌓 **Theming** - Switch between dark and light themes based on your preference
💻 **Cross-Platform** - Seamless experience across Android & iOS
🤖 **Android-Focused** - Optimized specifically for Android devices
📱 **Share Audio Functionality** - Share audios recorded on the App to Messages, WhatsApp, Files, Google Drive etc
📱 **Share Texts** - Share texts on the App to Messages, WhatsApp, Files, Google Drive etc

Expand All @@ -72,16 +72,16 @@ Download the latest APK files directly from [GitHub Releases](https://github.com
- Excellent performance across diverse audio conditions and accents
- Can run locally without internet dependency once model is downloaded

- **Cross-Platform Compatibility** - Designed for versatile deployment
- Consistent speech recognition quality across different operating systems
- **Android Optimized** - Designed specifically for Android devices
- Consistent speech recognition quality optimized for Android
- Flexible model sizes from tiny (39 MB) to large (1550 MB) based on accuracy needs
- Advanced noise robustness and speaker independence
- Perfect for applications requiring high-quality transcription in various environments
- Perfect for Android applications requiring high-quality transcription

## Built With 🛠

- **[Kotlin](https://kotlinlang.org/)** - Official programming language for Android development
- **[Compose Multiplatform](https://www.jetbrains.com/lp/compose-multiplatform/)** - UI toolkit for building native applications
- **[Compose Multiplatform](https://www.jetbrains.com/lp/compose-multiplatform/)** - UI toolkit for building Android applications
- **[Coroutines](https://kotlinlang.org/docs/coroutines-overview.html)** - For asynchronous programming
- **[Clean Architecture](https://developer.android.com/topic/architecture)** - Ensures scalability and testability
- **[ViewModel](https://developer.android.com/topic/libraries/architecture/viewmodel)** - Stores and manages UI-related data
Expand All @@ -107,15 +107,12 @@ Notely is built with Clean Architecture principles, separating the app into dist

`androidApp/`: Contains Android-specific code.

`iosApp/`: Contains iOS-specific code.

### Source Set Layout
The project uses Kotlin Multiplatform Android source set layout V2 for modern KMP best practices:
The project uses a simplified Android-focused architecture:
- `shared/src/androidMain/` - Android-specific implementation code
- `shared/src/androidInstrumentedTest/` - Android instrumented tests
- `shared/src/commonMain/` - Shared code across platforms
- `shared/src/commonMain/` - Shared code and business logic
- `shared/src/commonTest/` - Shared tests
- `shared/src/iosMain/` - iOS-specific implementation code

## Fork Management

Expand Down Expand Up @@ -201,7 +198,6 @@ To create a new release with APK distribution:
### Prerequisites

- Android Studio Ladybug or newer
- XCode 16.1
- JDK 17 or higher
- Kotlin 2.2.0 or higher

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@ Implement a direct recording flow that bypasses the current multi-step process (
- [ ] Flow reduces current 7+ clicks to just 2 clicks
## Implementation Plan

## Implementation Plan

### Phase 1: Speed Dial FAB Component (Material 3) - COMPLETED ✅
1. Create SpeedDialFAB.kt with Material 3 animations and accessibility
2. Replace existing FAB in NoteListScreen.kt with SpeedDialFAB
Expand Down Expand Up @@ -67,64 +65,6 @@ Implement a direct recording flow that bypasses the current multi-step process (
- Wait up to 1 second (10 x 100ms) for recording path to be populated
- Graceful fallback if path still unavailable after timeout
- **Status**: FIXED - Ready for testing
## Implementation Notes

## Implementation Notes

### Phase 1: Speed Dial FAB Component - COMPLETED ✅
**Files Created:**
- - Material 3 compliant expandable FAB component with:
- Data-driven sub-FAB architecture using data class
- Material 3 animation specifications (300ms expand, 150ms collapse)
- FastOutSlowInEasing for motion, LinearEasing for alpha transitions
- Proper accessibility semantics and content descriptions
- 50% opacity scrim overlay with click-to-dismiss
- Staggered animation delays (50ms between sub-FABs)

**Files Modified:**
- - Added string resource
- - Replaced Material 2 FloatingActionButton with SpeedDialFAB
- Added parameter to function signature
- Maintained existing for traditional flow

**Material 3 Compliance Achieved:**
- Migrated from to
- Used and (40dp)
- Applied M3 motion specifications: 300ms for medium transitions, 150ms for short
- Implemented proper touch targets and 16dp spacing
- Used and instead of deprecated

### Phase 2: Navigation Architecture - IN PROGRESS 🔄
**Files Modified:**
- - Added serializable route object

**Next Steps:**
1. Create enum for state management
2. Extend with quick record state handling
3. Add navigation handler in to wire up the route
4. Connect the quick record flow to existing recording infrastructure

### Technical Decisions Made:
1. **Component Reuse Strategy**: 95% reuse achieved by wrapping existing components
2. **Animation Approach**: Material 3 motion tokens with platform-agnostic values
3. **Architecture Pattern**: Data-driven sub-FAB list for maintainability
4. **Accessibility**: Comprehensive semantics and content descriptions
5. **State Management**: Local component state with external navigation callbacks

### Key Improvements Over Original Plan:
- Removed redundant in component
- Increased sub-FAB spacing to 16dp for better touch separation
- Used for proper M3 sizing
- Implemented staggered exit animations for polished UX
- Added proper semantic labels for screen readers

Phase 1 COMPLETED: Created SpeedDialFAB.kt with Material 3 compliance, updated NoteListScreen.kt to use new component, added string resources.

Phase 2 IN PROGRESS: Added Routes.QuickRecord to Routes.kt.

Technical achievements: 95% component reuse, Material 3 animations (300ms expand, 150ms collapse), proper accessibility, staggered sub-FAB animations.

Next: Create QuickRecordState enum, extend NoteListViewModel, wire navigation in App.kt.

## Implementation Notes

Expand All @@ -144,6 +84,13 @@ Next: Create QuickRecordState enum, extend NoteListViewModel, wire navigation in
- Added navigateToQuickRecord parameter to function signature
- Maintained existing navigateToNoteDetails for traditional flow

**Material 3 Compliance Achieved:**
- Migrated from androidx.compose.material to androidx.compose.material3
- Used FloatingActionButton.small() and proper sizing (40dp)
- Applied M3 motion specifications: 300ms for medium transitions, 150ms for short
- Implemented proper touch targets and 16dp spacing
- Used MaterialTheme.colorScheme and LocalContentColor instead of deprecated APIs

### Phase 2: Navigation Architecture - COMPLETED ✅
**Files Modified:**
- **Routes.kt** - Added Routes.QuickRecord serializable route object
Expand Down Expand Up @@ -191,83 +138,16 @@ Next: Create QuickRecordState enum, extend NoteListViewModel, wire navigation in
5. **Dependency Injection**: Factory pattern for BackgroundTranscriptionService
6. **Material 3 Compliance**: Full migration with proper animations and semantics

### Current Status: Phase 4 COMPLETED ✅
**Remaining Work:**
- Phase 5: Integration & Polish (progress indicators, end-to-end testing, accessibility)

### Current Status: Phase 5 COMPLETED ✅
**Major Milestones Achieved:**
- 2-click flow implemented: SpeedDialFAB → Recording → Auto-transcription → Note creation
- Background transcription with automatic note creation
- Complete Material 3 compliance with accessibility support
- Comprehensive error handling and state management
- Full integration with existing architecture and DI system
- Critical race condition bug fixed with retry logic

**Build Status**: ✅ Android debug APK builds successfully
**Next**: Add visual progress indicators for background processing and complete end-to-end testing
## Implementation Notes

### Phase 1: Speed Dial FAB Component - COMPLETED ✅
**Files Created:**
- **SpeedDialFAB.kt** - Material 3 compliant expandable FAB component with:
- Data-driven sub-FAB architecture using FabAction data class
- Material 3 animation specifications (300ms expand, 150ms collapse)
- FastOutSlowInEasing for motion, LinearEasing for alpha transitions
- Proper accessibility semantics and content descriptions
- 50% opacity scrim overlay with click-to-dismiss
- Staggered animation delays (50ms between sub-FABs)

**Files Modified:**
- **strings.xml** - Added note_list_quick_record string resource
- **NoteListScreen.kt** - Replaced Material 2 FloatingActionButton with SpeedDialFAB
- Added navigateToQuickRecord parameter to function signature
- Maintained existing navigateToNoteDetails for traditional flow

**Material 3 Compliance Achieved:**
- Migrated from androidx.compose.material to androidx.compose.material3
- Used FloatingActionButton.small() and proper sizing (40dp)
- Applied M3 motion specifications: 300ms for medium transitions, 150ms for short
- Implemented proper touch targets and 16dp spacing
- Used MaterialTheme.colorScheme and LocalContentColor instead of deprecated APIs

### Phase 2: Navigation Architecture - COMPLETED ✅
**Files Modified:**
- **Routes.kt** - Added Routes.QuickRecord serializable route object
- **QuickRecordState.kt** - Created enum for state management (Idle, Recording, Processing, Complete, Error)
- **NoteListPresentationState.kt** - Added quickRecordState and quickRecordError fields
- **NoteListIntent.kt** - Added quick record intents (OnQuickRecordStarted, OnQuickRecordCompleted, OnQuickRecordError, OnQuickRecordReset)
- **NoteListViewModel.kt** - Extended with quick record state management and handler methods
- **App.kt** - Added QuickRecord navigation handler with isQuickRecordMode=true parameter

**Technical Decisions Made:**
1. **Component Reuse Strategy**: 95% reuse achieved by wrapping existing components
2. **Animation Approach**: Material 3 motion tokens with platform-agnostic values
3. **Architecture Pattern**: Data-driven sub-FAB list for maintainability
4. **Accessibility**: Comprehensive semantics and content descriptions
5. **State Management**: Enum-based quick record states with ViewModel integration

### Phase 3: Recording Flow Enhancement - IN PROGRESS 🔄
**Next Steps:**
1. Add isQuickRecordMode parameter to RecordingScreen.kt
2. Implement auto-flow logic (skip initial screen, auto-navigate)
3. Test recording flow end-to-end

**Remaining Phases:**
- Phase 4: Background Processing Engine (BackgroundTranscriptionService, auto-note creation)
- Phase 5: Integration & Polish (end-to-end testing, accessibility validation)

### Key Improvements Over Original Plan:
- Removed redundant TouchableOpacity in SpeedDialFAB component
- Increased sub-FAB spacing to 16dp for better touch separation
- Used FloatingActionButton.small() for proper M3 sizing
- Implemented staggered exit animations for polished UX
- Added proper semantic labels for screen readers
- Created comprehensive state management system for quick record flow

Phase 1 & 2 COMPLETED: Created SpeedDialFAB.kt with Material 3 compliance, updated NoteListScreen.kt, added complete navigation architecture, state management, and wired QuickRecord route in App.kt.

Phase 3 IN PROGRESS: Ready to add isQuickRecordMode parameter to RecordingScreen.kt.

Technical achievements: 95% component reuse, Material 3 animations (300ms expand, 150ms collapse), proper accessibility, staggered sub-FAB animations, comprehensive state management with enum-based states and ViewModel integration.
## Technical Approach
- Speed Dial FAB following Material 3 guidelines
- 95%+ component reuse strategy
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
---
id: task-053
title: Remove iOS platform components to transition to Android-only application
status: Done
assignee: []
created_date: '2025-07-27'
updated_date: '2025-07-27'
labels: []
dependencies: []
---

## Description

Transform Notely Capture from a Kotlin Multiplatform project to an Android-only application by removing all iOS-specific components, build configurations, and source code. This aligns with the project's focus on Android development while maintaining the ability to sync with upstream changes for Android and common modules.

## Acceptance Criteria

- [ ] Complete iosApp/ directory removal
- [ ] iOS targets removed from all build.gradle.kts files
- [ ] iOS source sets removed from shared and core modules
- [ ] iOS cinterop configurations removed
- [ ] All iosMain source directories deleted
- [ ] Android build functionality verified
- [ ] No orphaned expect/actual declarations remain
- [ ] Documentation updated appropriately

## Implementation Plan

1. Create feature branch for iOS removal work\n2. Remove entire iosApp/ directory and all contents\n3. Clean up shared/build.gradle.kts to remove iOS targets, source sets, and cinterop configurations\n4. Clean up core/audio/build.gradle.kts to remove iOS targets\n5. Remove iOS-specific source directories (iosMain/, iosTest/, nativeInterop/)\n6. Verify all expect/actual declarations still have Android implementations\n7. Test Android build functionality\n8. Commit changes following project conventions

## Implementation Notes

Successfully removed all iOS platform components and transitioned Notely Capture to an Android-only application.

**Approach Taken:**
- Systematic removal following the comprehensive iOS Component Removal Audit (doc-002)
- Used feature branch workflow to ensure safe changes
- Verified Android build functionality throughout the process

**Components Removed:**
- Entire iosApp/ directory (173 files including Swift code, Xcode project, whisper.xcframework)
- iOS targets and source sets from shared/build.gradle.kts and core/audio/build.gradle.kts
- iOS-specific source directories: iosMain/, iosTest/, nativeInterop/
- iOS cinterop configurations for Whisper framework integration

**Technical Validation:**
- Confirmed all expect/actual declarations retain Android implementations
- Verified clean Android build (./gradlew assembleDebug) succeeds
- All existing functionality preserved for Android platform

**Files Modified:**
- shared/build.gradle.kts: Removed iOS targets, source sets, and cinterop configurations
- core/audio/build.gradle.kts: Removed iOS targets and framework configurations
- Deleted 173 files across iosApp/, iosMain/, iosTest/, and nativeInterop/ directories

**Benefits Achieved:**
- Simplified build configuration focused on Android development
- Reduced project size by ~56MB (whisper.xcframework removal)
- Maintained clean architecture and ability to sync upstream Android changes
- Eliminated iOS-specific maintenance overhead
Loading
Loading