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.