ここ数週間、借金や貸し借り、返済を記録する小さなアプリTinyDebtを開発してきました。小さく目的を絞ったアプリを作る方の参考になればと思い、技術的な選択をいくつか紹介します。
🧩 開発した理由
友人との小さな貸し借りをよく忘れてしまい、既存のアプリは登録や大量の広告、複雑な金融機能があり、重く感じていました。
欲しかったのは、次のようなアプリです。
- すぐに起動する
- 3〜5秒で借金を追加できる
- オフラインで使える
- ずっとシンプルなまま
こうしてTinyDebtが生まれました。
⚙️ 技術スタック
TinyDebtは意図的に軽量にしています。
- モバイルアプリにReact Native(Expo)を使用
- AsyncStorageによるローカル優先の設計
- バックエンドなし。データは端末内に保存(バックアップのみFirebaseを使用)
- 全体でTypeScriptを使用
- UIライブラリではなく独自コンポーネントによるミニマルなUI
- EAS BuildでApp StoreとGoogle Play向けにパッケージ
ユーザーアカウントも分析機能もなく、必要最低限以外の外部依存関係もありません。
🗂️ データモデル
借金の記録は次のような形です。
type Debt = {
id: string;
name: string;
amount: number;
type: "owed" | "borrowed";
createdAt: number;
history: Repayment[];
};
type Repayment = {
amount: number;
date: number;
};すべてをシリアライズ可能にしておくと、保存や移行が簡単になります。
🧠 ローカル優先のUX
TinyDebtはサーバーに依存しないため、次のような特徴があります。
- 操作がすぐに反映される
- 読み込み中や同期中の状態がない
- 古い端末でも快適に動く
個人向けの小さなツールにぴったりです。
🎨 UIの考え方
アプリには落ち着いた印象を持たせたかったので、次のようにしました。
- シンプルで落ち着いた色
- グラフやダッシュボードなし
- 余計な要素を省き、1画面で作業の90%を完結
- すばやく入力できる押しやすいタップ領域
小さなアプリは、役立つために複雑な見た目である必要はありません。
📦 公開
- こちらで公開中: App Store
- こちらで公開中: Google Play
ただし、規模は小さく保ちたいと思っています。それが開発の目的だからです。
🙌 フィードバック歓迎
モバイルアプリを開発している方や、ローカル優先のユーティリティについて意見がある方は、ぜひ感想をお聞かせください。継続的に改善しています。
