Bygga
Type the product name from the box. Bygga shows every assembly step in 3D, with the parts, screws and tools for each one, and reads it out loud.
翻譯準備中
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Simple fuel logging app with fuel refill prediction
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Website · Download latest APK · Add to Obtainium · GitHub · Codeberg
A fuel tracking app for Android. Log fill-ups, track mileage across multiple vehicles, and get predictions for your next refuel.
Built with Jetpack Compose, Room, and manual dependency injection. Ships at ~1.2MB.
Landing page source: website/ (Astro, black-and-white neubrutalism). Obtainium URL: obtainium://app/https://github.com/ChandanShakya/FuelLog. Mirrors: GitHub · Codeberg
Vehicle and fuel management
Predictions and analysis
Practical tools
| Layer | Technology |
|---|---|
| UI | Jetpack Compose + Material 3 |
| Database | Room (5 tables, version 11) |
| DI | Manual (AppContainer pattern) |
| Navigation | Sealed class + AnimatedContent (no Navigation Compose) |
| Architecture | MVVM with Kotlin Flows |
| Build | Kotlin, KSP, R8 full mode |
Requires Android Studio and minSdk 26.
git clone <repo-url>
cd FuelLog
./gradlew assembleDebug
Install the debug APK on a device or emulator.
./gradlew assembleDebug # debug build
./gradlew test # unit tests
Passwords live in app/build.gradle.kts (alias fuellog). The keystore file itself is gitignored.
Place release.keystore in the project root, then:
./gradlew assembleRelease
CI: only RELEASE_KEYSTORE_BASE64 is required (base64 of release.keystore). Workflows decode it to release.keystore before assembleRelease. Codeberg also needs CODEBERG_TOKEN to publish the release.
Release builds use R8 minification, resource shrinking, and locale stripping (English only).
./gradlew test # all unit tests
./gradlew testDebugUnitTest # debug unit tests only
./gradlew connectedDebugAndroidTest # instrumentation tests (device required)
Test coverage:
app/src/main/java/com/chandanshakya/fuellog/
data/
backup/ JSON export/import (validated, transactional)
db/ Room database, DAOs, type converters
model/ Entity classes and enums
ui/
chart/ Canvas-based line charts
components/ Reusable composables (dialogs, text fields, badges, cards)
navigation/ Screen sealed class, manual nav host with AnimatedContent
screens/ Screen composables
viewmodel/ ViewModels with factory-based instantiation
util/ Unit converter, currency/money helpers, mileage calculator,
tank capacity learner, fill-up predictor
di/ AppContainer (manual dependency injection)
Five tables with foreign key constraints:
| Table | Purpose |
|---|---|
vehicles | Vehicle profiles: name, type, distance/volume units, tank capacity |
fuel_entries | Fill records: odometer, volume, cost, date, full-tank flag, FK to vehicle and pump |
fuel_pumps | Named fuel pumps/stations |
odometer_readings | Standalone odometer check-ins between fill-ups |
user_settings | Global defaults: currency, distance unit, volume unit |
Schema version is 11. Do not bump the version without adding a real Migration. The app uses fallbackToDestructiveMigrationOnDowngrade() only — upgrades with a missing migration fail loudly instead of silently wiping user data. Export Room schemas when adding migrations (exportSchema is currently false; enable it and commit schemas before the next version bump).
When you mark a fill-up as "full tank", the app records the fuel volume added. Between two consecutive full-tank fill-ups, the volume added approximates the actual tank capacity. The algorithm computes a median-based suggestion with confidence levels (low/medium/high) based on how many full-tank pairs are available. Suggestions appear on the Insights screen and are applied manually — the app never overwrites your value.
Logging a new odometer reading without buying fuel immediately shortens remaining range and moves the predicted date earlier.
Costs are stored as Double for Room/JSON compatibility but are always rounded to 2 decimal places on save and when summing (Money.roundToCents / Money.sumCents). Display uses a per-thread DecimalFormat (thread-safe under concurrent Flow collection).
Export writes versioned JSON. Import validates the entire payload first, then clears and inserts inside a single Room transaction — a parse/validation error leaves existing data untouched. Android Auto Backup is disabled; use in-app export for backups.
MIT — see LICENSE.