Year Progress Dots is a minimalist mobile application that visualizes year progress through an elegant dot grid. Each day of the year is represented as a dot, with completed days highlighted in gold, today marked with an animated pulse, and future days shown in subtle gray.
- Visual Progress Tracking: Unique dot grid visualization of the year.
- Minimalist Design: "Dark mode first" aesthetic with dramatic contrast.
- Cross-Platform: Built for iOS, Android, and Web.
- Customizable: Adjust dot size, colors, and spacing.
- Native Widget: Includes a native Android Live Wallpaper service.
- Frontend: React Native (Expo SDK 54), React Navigation v7, Reanimated.
- Backend: Node.js with Express 5 (for API and sync features).
- Storage: AsyncStorage (local preferences), Drizzle ORM (backend).
- Native Integration: Kotlin (Android) and Swift (iOS) for platform-specific features.
The project is organized into the following key directories:
client/: The main React Native application source code.screens/: Application screens (Year Progress, Settings).components/: Reusable UI components (DotGrid, ColorPicker).constants/: Theme and configuration constants.lib/: Utility functions and storage helpers.
server/: The Node.js/Express backend server.shared/: Types and schemas shared between client and server.android/: Generated Android native project (Gradle based).ios/: Generated iOS native project (Xcode based).scripts/: Build and utility scripts.
- Node.js (v18 or newer)
- npm or yarn
- Mobile Development Environment:
- Android: Android Studio, JDK 17, Android SDK.
- iOS: Xcode (macOS only), CocoaPods.
- Clone the repository.
- Install dependencies:
npm install
Start the development server:
npm run expo:devRun on specific platforms:
# Android
npm run android
# iOS
npm run iosYou can download the latest Android APK from the Releases section of this repository.
- Download
app-release.apk. - Install it on your device.
Note: Play Protect might warn you since this is signed with a debug key. You can safely ignore this and proceed.
Due to Apple's signing requirements, we cannot provide a pre-built IPA. Please follow the Building for Production instructions below to build and install it using Xcode.
This project uses Expo "Prebuild" (Bare Workflow), meaning native directories (android and ios) are present and can be built using standard native tools.
-
Navigate to the android directory:
cd android -
Clean the build:
./gradlew clean
-
Build the release APK:
./gradlew assembleRelease
The APK will be located at
android/app/build/outputs/apk/release/app-release.apk.Note: For the Play Store, you should generate an App Bundle (AAB) instead:
./gradlew bundleRelease
-
Signing: By default, this will produce an unsigned or debug-signed APK. To sign it for release, verify your
android/app/build.gradlesigning config or set up akeystore.propertiesfile.
Requires macOS and Xcode.
-
Install Pods:
cd ios pod install cd ..
-
Open the Workspace: Open
ios/YearProgress.xcworkspacein Xcode. -
Configure Signing:
- In Xcode, select the YearProgress project in the navigator.
- Go to the Signing & Capabilities tab.
- Select your Team and ensure the Bundle Identifier matches your Apple Developer account provisioning profile.
-
Archive:
- Select Product > Archive from the menu bar.
- Once checking is complete, the Organizer window will open, allowing you to Distribute App to the App Store or Ad Hoc.
For more design details, see design_guidelines.md.