Skip to content
RexSASPublic

About

Android app for ski instructors to log lessons, hours and pay. Lessons stay on your phone.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Karvo logo

Karvo

Keep track of every ski lesson you teach — hours, students and pay, right on your phone.

Latest release Android 8.0+ Kotlin + Jetpack Compose Data stays on your phone


Ski instructors are paid by the hour, and at the end of the month the hours have to add up. Karvo is a small, fast app to log each lesson the moment it ends and check your monthly hours against what the ski school pays you.

Add a lesson   Overview with statistics   Top students podium   Settings

Features

  • Log a lesson in seconds — date, duration (quick buttons for 1h, 1h 30m, 2h, 3h), student name with suggestions from previous lessons, and optional notes. Group lessons? Just write it in the name, e.g. Group Rossi.
  • Monthly and lifetime hours — the Overview shows your total hours and a row for every month; tap a month to see its lessons. On Lessons, each month is grouped with its total.
  • Private earnings — set your hourly rate and Karvo calculates what you earned. Amounts stay hidden as **** € until you tap the eye and confirm with your fingerprint (or phone PIN), and hide again when you leave the screen.
  • Paid months — tick a month as paid when the school pays you. Badges show which months are paid or only partly paid, and the Overview shows what you're still owed.
  • Seasons — this season's hours and earnings compared with last season at the same date, plus a list of every season. The season start month is up to you (November by default).
  • Statistics with charts — under your totals, the Overview shows lessons this month, average lesson length, your number of students, a 6-month hours chart, a podium of your top students and your busiest weekdays. Any money there stays hidden until you tap the eye.
  • Alpine Night theme — a starry night sky over snow-lit mountains, deep-navy tiles and gold accents, with an animated splash screen. On by default; prefer a plain look? Pick Classic in Settings.
  • Swipe between pages — swipe left and right to move between Lessons, Overview and Settings.
  • Italiano / English — the app follows your phone's language, or pick one in Settings.
  • Edit or undo — tap a lesson to fix it, or swipe it away and confirm to delete. Changed your mind? Tap Undo.
  • Automatic updates — when a new version is out, Karvo offers it when you open the app, backs up your lessons first and installs it with Android's installer.
  • Backups and restore — up to 3 backups are kept inside the app (one before every update, or any time with Back up now). Restore one from Settings → Backups, behind two confirmation steps.
  • Export and import CSV — save all your lessons as a spreadsheet to keep a backup or send to the ski school, and import a Karvo or MasterSki file to bring lessons over (duplicates are skipped).
  • Your time zone — "today" follows the time zone you pick (default Europe/Rome).
  • Private — no account, no tracking. The internet is used only to check GitHub for updates; Karvo itself never sends your lessons anywhere. If your phone's Google backup is on, Android includes Karvo's data in it, so your lessons come back when you set up a new phone.

Install

  1. On your Android phone, open the latest release and download Karvo-x.y.apk.
  2. Open the file and allow Install unknown apps when Android asks. Karvo updates itself: it asks once to be allowed to install apps.
  3. Open Karvo, set your hourly rate in Settings, and log your first lesson with +.

Note

Karvo is the new name of MasterSki. It's installed as a new app, so it starts empty: if you used MasterSki, uninstall it after switching. See the changelog for what's new.

Warning

Uninstalling the app deletes all lessons from the phone (unless your phone's Google backup brings them back on reinstall). Use Settings → Export to CSV regularly as a backup; you can bring it back with Settings → Import from CSV.

Roadmap

Planned features, ticked off as they ship.

2.1 — Pay and history

  • Import from CSV — load a Karvo or MasterSki export, e.g. to bring old lessons over or move to a new phone.
  • Paid months — tick a month as paid when the school pays you (the date is saved); Overview shows what's still unpaid, a lesson added later makes the month "partly paid", and the paid status is kept in CSV exports and backups.
  • Season totals — totals per ski season (starting in the month you choose, November by default), compared with last season at the same date.
  • Fingerprint unlock — reveal earnings with your fingerprint.

2.2 — Faster and more fun

  • Repeat a lesson — long-press a lesson to log the same student and duration again in one tap.
  • Badges and achievements — season milestones (50h, 100h, 250h…) with a small celebration.
  • Evening reminder — optional notification on days with nothing logged.
  • Search and filters — find lessons by student name and filter the list.

2.3 — Home screen and profiles

  • Widget — this month's hours, badge and goal progress, with a quick + to add a lesson.
  • Profile manager — add more profiles on the same phone, each with its own lessons, and switch between them.
  • Season page — tap a season in the Seasons list to open a page with every month of that season and all its details (hours, earnings, lessons, paid status).
  • More to be decided.

Ideas for later

  • Season heatmap (one square per day, coloured by hours taught).
  • Student pages (all lessons and total hours per student).
  • Monthly hours goal with a progress ring on Overview.

Build from source

Requirements: JDK 17 and the Android SDK (platform 35, build-tools 35.0.0).

export JAVA_HOME=$HOME/.local/jdk17
export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$JAVA_HOME/bin:$ANDROID_HOME/platform-tools:$PATH

./gradlew testDebugUnitTest   # run the tests
./gradlew installDebug        # install a debug build on a connected phone
./gradlew assembleRelease     # build app/build/outputs/apk/release/app-release.apk

Release signing

Create a keystore once:

keytool -genkeypair -v -keystore ~/karvo-release.jks -alias karvo -keyalg RSA -keysize 2048 -validity 10000

Then add keystore.properties in the repository root:

storeFile=~/karvo-release.jks
storePassword=...
keyAlias=karvo
keyPassword=...

Without this file assembleRelease produces an unsigned APK that cannot be installed.

Caution

Back up the keystore and its password. If you lose them, updates can no longer be installed over the existing app. Never commit the keystore or keystore.properties (both are git-ignored).

A debug build is signed differently from the release build: uninstall it (export your lessons first!) before installing the release.

Publishing a release

The in-app updater reads https://api.github.com/repos/RexSAS/Karvo/releases/latest, so every release must:

  • use a tag like v1.3.0 (a higher number than the installed version);
  • have exactly one .apk asset;
  • be signed with the same keystore (Android refuses updates signed with another key);
  • bump versionCode and versionName in app/build.gradle.kts.

To test the update flow before publishing, build a private APK that thinks it is older: ./gradlew assembleRelease -PversionNameOverride=1.0.9.

Tech

Kotlin · Jetpack Compose (Material 3) · Room · DataStore · Navigation Compose · AppCompat per-app languages · MVVM · JUnit + Robolectric

About

Android app for ski instructors to log lessons, hours and pay. Lessons stay on your phone.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages