TRACE

TRACETime Recording App for Clients and Efficiency)は、個人向けの作業時間記録Webアプリケーションである。スマートフォンのホーム画面からPWAとしてアクセスし、クライアント・プロジェクト・作業種別のタグを選択してワンタップで作業記録を開始できる。データはすべてJSONファイルとしてサーバー上に保存され、データベースは使用しない。

TRACEでは「リアルタイム記録」と「手動入力」の2つの記録方式をサポートしている。リアルタイム記録では「開始」ボタンを押すだけで前の作業が自動終了し、新しい作業の計測が即座に開始される。手動入力では開始時刻・終了時刻を直接指定して、過去の記録の追加や修正を行うことができる。さらに、新しい日にアプリへ初めてアクセスした際に、前日分の作業サマリーをCSV添付のメールで自動送信する日次レポート機能を備えている。

概要

TRACEは、フリーランスや個人事業主が日々の作業時間をクライアント・プロジェクト単位で正確に記録し、効率的に管理するために設計されたWebアプリケーションである。バックエンドにPHP、データ保存にJSONファイルを採用することで、データベースの構築・運用コストを排除し、サーバーなどの一般的なレンタルサーバー上で即座に稼働できる構成となっている。

フロントエンドはPWA(Progressive Web App)に対応しており、スマートフォンのホーム画面にアイコンを追加すれば、ネイティブアプリのように起動してワンタップで作業記録を開始できる。認証にはPINコード方式を採用し、IDの入力を不要にすることでログインの手間を最小限にしている。

特徴

技術構成

TRACEは、フロントエンドとバックエンドを分離したSPA(Single Page Application)風の構成を採用している。フロントエンドのapp.jsがAPI経由でバックエンドのPHPと通信し、JSONファイルの読み書きを行う。

項目 技術 説明
フロントエンド HTML / CSS / JavaScript PWA対応。Service Workerによるアプリシェルキャッシュ
バックエンド PHP APIエンドポイント(api.php)で全操作を処理
データ保存 JSONファイル サーバー上のdata/ディレクトリに格納。DB不要
メール送信 mb_send_mail() / mail() 日次レポートの自動送信に使用
ホスティング サーバー レンタルサーバーの標準PHP環境で動作
認証 PINコード + PHPセッション セッション有効期限3時間。PINはハッシュ化して保存
スマートフォン (PWA) app.js(フロントエンド) style.css sw.js(Service Worker) manifest.json HTTP API JSON Response サーバー (PHP) index.php(ルーティング) api.php(APIエンドポイント) includes/(処理モジュール) mail.php(メール送信) auth.php(認証処理) R/W data/ config.json tags.json current.json records/yyyymmdd.json 日次レポートメール CSV添付・自動送信
TRACEのシステム構成図

認証

TRACEでは、個人利用を前提としたシンプルなPINコード認証を採用している。ユーザーIDの入力は不要であり、数字のみのPINコードを入力するだけでログインできる。

PINコード入力

アプリにアクセスすると、まずPIN入力画面が表示される。PINコード入力フィールドと送信ボタンのみのシンプルな構成であり、正しいPINを入力するとメイン画面に遷移する。PINコードはconfig.jsonにハッシュ化された状態で保存されており、入力されたPINのハッシュ値と照合して認証を行う。

セッション管理

項目 仕様
セッション有効期限 3時間
期限切れ時の挙動 PIN入力画面にリダイレクトし、再認証を求める
PINコードの変更 管理画面から変更可能
PINコードの保存形式 ハッシュ化してconfig.jsonに保存
💡
セッション有効期限について — 3時間の有効期限は、一般的な作業セッション(午前・午後のブロック)をカバーする長さに設定されている。頻繁な再ログインを避けつつ、セキュリティを一定レベルで維持する。

データ構造

TRACEのすべてのデータは、サーバー上のdata/ディレクトリにJSONファイルとして保存される。データベースを使用しないことで、環境構築の手間を省き、ファイルのバックアップやリストアも容易になっている。

タグマスタ(tags.json)

作業の分類に使用する3つのカテゴリ(クライアント、プロジェクト、作業種別)のタグを管理するマスタファイルである。プロジェクトはclient_idでクライアントに紐づき、クライアント選択時に該当プロジェクトのみが表示される。activeフラグにより論理削除を行い、過去の記録との整合性を維持する。

{
  "clients": [
    { "id": "c001", "name": "A社", "active": true },
    { "id": "c002", "name": "B社", "active": true }
  ],
  "projects": [
    { "id": "p001", "name": "Webサイトリニューアル", "client_id": "c001", "active": true },
    { "id": "p002", "name": "業務システム開発", "client_id": "c002", "active": true }
  ],
  "task_types": [
    { "id": "t001", "name": "コーディング", "active": true },
    { "id": "t002", "name": "ミーティング", "active": true },
    { "id": "t003", "name": "資料作成", "active": true }
  ]
}
カテゴリ IDプレフィックス 親への紐づけ 説明
クライアント c なし 取引先・顧客
プロジェクト p client_idでクライアントに紐づく クライアントごとの案件
作業種別 t なし(全クライアント共通) 作業の種類(コーディング、ミーティング等)

作業記録(日別ファイル:records/yyyymmdd.json)

作業記録は日付ごとに個別のJSONファイルとして保存される。ファイル名はyyyymmdd.json形式(例:20260212.json)とし、日別にファイルが分かれることでデータの管理・バックアップが容易になっている。

{
  "date": "2026-02-12",
  "records": [
    {
      "id": "r001",
      "client_id": "c001",
      "project_id": "p001",
      "task_type_id": "t001",
      "detail": "トップページのレスポンシブ対応",
      "start_time": "2026-02-12 09:00:00",
      "end_time": "2026-02-12 10:30:00",
      "duration_minutes": 90,
      "input_type": "realtime"
    },
    {
      "id": "r002",
      "client_id": "c002",
      "project_id": "p002",
      "task_type_id": "t002",
      "detail": "",
      "start_time": "2026-02-12 10:30:00",
      "end_time": null,
      "duration_minutes": null,
      "input_type": "realtime"
    }
  ]
}
フィールド 説明
id string レコード固有のID
client_id string クライアントのタグID
project_id string プロジェクトのタグID
task_type_id string 作業種別のタグID
detail string 作業の詳細メモ(任意)
start_time string 開始時刻(YYYY-MM-DD HH:MM:SS形式)
end_time string / null 終了時刻。nullの場合は進行中
duration_minutes int / null 作業時間(分)。進行中の場合はnull
input_type string "realtime"(リアルタイム計測)または"manual"(手動入力)

設定ファイル(config.json)

アプリ全体の設定を管理するファイルである。PINコード(ハッシュ化済み)、メール送信先アドレス、日次レポートの送信状況を保持する。

{
  "pin_code": "$2y$10$...(ハッシュ化されたPIN)",
  "email": "user@example.com",
  "last_daily_report_date": "2026-02-11"
}
フィールド 説明
pin_code PINコードのハッシュ値。認証時に照合に使用
email 日次レポートの送信先メールアドレス
last_daily_report_date 日次レポート送信済みの最終日。二重送信の防止に使用

現在の作業状態(current.json)

進行中の作業を素早く参照するためのファイルである。日別の作業記録ファイルを毎回走査する必要がなく、現在の作業状態を即座に取得できる。

{
  "is_active": true,
  "record_date": "2026-02-12",
  "record_id": "r002"
}
フィールド 説明
is_active 現在作業が進行中であるかどうか
record_date 進行中の作業が記録されている日付
record_id 進行中の作業レコードのID

画面構成

TRACEは3つの画面で構成される。PIN入力画面、メイン画面(トラッキング画面)、管理画面である。すべての画面はレスポンシブ対応で、スマートフォンからPC まで快適に操作できる。

PIN入力画面

アプリへのアクセス時に最初に表示される画面である。PINコード入力フィールドと送信ボタンのみのシンプルな構成で、正しいPINを入力するとメイン画面に遷移する。セッションが有効な場合(3時間以内の再アクセス)はこの画面をスキップし、直接メイン画面に遷移する。

⏱️
TRACE
Time Recording App
● ● ● ●
ログイン
PIN入力画面のイメージ

メイン画面(トラッキング画面)

メイン画面は、現在の作業状況表示、リアルタイム記録、手動入力の3つのエリアで構成されるTRACEの中核画面である。

エリア 構成要素 説明
現在の作業状況表示エリア
作業状況 作業情報 進行中の作業のクライアント名・プロジェクト名・作業種別・詳細を表示
経過時間 リアルタイムでカウントアップ表示。作業なしの場合は「作業なし」と表示
リアルタイム記録エリア
入力フォーム クライアント選択 セレクトボックスまたはタグボタン。新規入力可
プロジェクト選択 選択したクライアントに紐づくもののみ表示。新規入力可
作業種別選択 全クライアント共通の選択肢。新規入力可
詳細入力 テキストエリア(任意)。作業内容のメモ
開始 / 終了ボタン 「開始」で新しい作業を開始(前の作業は自動終了)。「終了」で明示的に終了
手動入力エリア
追加項目 開始時刻 手入力で開始時刻を指定
終了時刻 手入力で終了時刻を指定。過去の記録の追加・修正に使用
現在の作業
A社
Webサイトリニューアル
コーディング
1:23:45
経過時間
リアルタイム記録
クライアント
A社
プロジェクト
Webサイトリニューアル
作業種別
コーディング ミーティング 資料作成
詳細(任意)
トップページのレスポンシブ対応
開始
終了
メイン画面(トラッキング画面)のイメージ

管理画面

タグの管理とアプリ設定の変更を行う画面である。メイン画面のヘッダーまたはメニューからアクセスする。詳細は「8. 管理画面」セクションを参照。

リアルタイム記録

リアルタイム記録は、TRACEの主要な作業記録方式である。タグを選択して「開始」ボタンを押すだけで、作業時間の計測が自動的に開始される。

操作手順

  1. メイン画面のリアルタイム記録エリアでクライアントを選択する
  2. 選択したクライアントに紐づくプロジェクトを選択する
  3. 作業種別を選択する(コーディング、ミーティング、資料作成 等)
  4. 必要に応じて詳細を入力する(任意)
  5. 「開始」ボタンをタップする
  6. 現在の作業状況表示エリアに作業情報と経過時間がリアルタイムで表示される
  7. 作業が終わったら「終了」ボタンで明示的に終了するか、次の作業の「開始」で自動終了させる

前の作業の自動終了

「開始」ボタンを押すと、進行中の作業がある場合は自動的に終了処理が行われる。前の作業のend_timeに現在時刻が記録され、duration_minutesが自動計算される。この仕組みにより、作業の切り替え時に「終了」→「開始」の2ステップが不要となり、ワンタップで次の作業に移行できる。

💡
作業の切り替え — 作業Aの途中で作業Bの「開始」を押すと、作業Aは自動終了し、作業Bが即座に開始される。終了時刻と開始時刻は同じ時刻になるため、空白時間が生じない。明示的に休憩を取る場合は「終了」ボタンを使用する。

新規タグの即時登録

クライアント、プロジェクト、作業種別のいずれの選択肢にも該当するものがない場合、その場で新しい名前を入力できる。入力された新しいタグは自動的にtags.jsonに登録され、以降の選択肢として表示される。新規プロジェクトを入力した場合は、現在選択中のクライアントに自動的に紐づけられる。

手動入力

手動入力は、リアルタイム記録では対応できない過去の作業記録の追加や、既存記録の修正に使用する記録方式である。リアルタイム記録と同じタグ選択UIに加え、開始時刻と終了時刻を直接指定するフィールドが追加されている。

操作手順

  1. メイン画面の手動入力エリアを開く
  2. クライアントプロジェクト作業種別を選択する(リアルタイム記録と同じUI)
  3. 必要に応じて詳細を入力する(任意)
  4. 開始時刻を入力する(日付と時刻)
  5. 終了時刻を入力する(日付と時刻)
  6. 「登録」ボタンをタップする
  7. duration_minutesは開始・終了時刻から自動計算される

手動入力で登録されたレコードはinput_type"manual"として保存され、リアルタイム記録("realtime")と区別できる。

想定される利用場面

管理画面

管理画面では、タグの管理とアプリの設定変更を行う。メイン画面のヘッダーまたはメニューからアクセスする。

タグ管理

クライアント・プロジェクト・作業種別の3カテゴリについて、以下の操作を行うことができる。

操作 説明
一覧表示 各カテゴリのタグ一覧を表示。有効なタグと無効化されたタグを区別して表示する
追加 新しいタグを追加する。プロジェクトの場合は紐づけるクライアントを指定する
編集 既存のタグ名を変更する
無効化(論理削除) activeフラグをfalseに設定する。過去の記録には影響せず、新規の選択肢から非表示になる
👆
論理削除について — タグの無効化(論理削除)は、物理削除と異なり、過去の作業記録が参照しているタグIDとの整合性を維持する。無効化されたタグは新しい作業の記録時に選択肢として表示されなくなるが、過去の記録の表示時には正しくタグ名が解決される。

設定変更

設定項目 説明
PINコードの変更 ログインに使用するPINコードを変更する。変更後は新しいPINでの再ログインが必要
メール送信先アドレスの変更 日次レポートの送信先メールアドレスを変更する

日次レポートメール

TRACEは、前日の作業サマリーを自動的にメールで送信する日次レポート機能を備えている。手動でのレポート作成が不要になり、日々の作業実績を自動的にアーカイブできる。

送信トリガー

新しい日にアプリへ初めてアクセスした際に、前日分のレポートが自動的にメールで送信される。config.jsonlast_daily_report_dateと現在の日付を照合し、未送信の場合のみ送信処理を実行する。これにより、同じ日のレポートが二重送信されることを防止している。

アプリにアクセス (翌日の初回) 未送信? 日付照合 YES NO 送信スキップ メール送信 CSV添付 日付を 更新 日次レポート送信フロー
日次レポートメールの送信フロー

メール内容

項目 内容
件名 作業記録 yyyymmdd(例:作業記録 20260211
本文 前日の作業サマリー(作業一覧と合計時間)
添付ファイル yyyymmdd.csv(前日の作業記録をCSV形式で出力)
送信元 サーバーのmail()関数による送信
送信先 config.jsonemailで指定されたアドレス

CSV形式

添付されるCSVファイルは以下の形式で出力される。ヘッダー行に続いて、各作業記録が1行ずつ記載される。

開始時刻,終了時刻,時間(分),クライアント,プロジェクト,作業種別,詳細
2026-02-11 09:00,2026-02-11 10:30,90,A社,Webサイトリニューアル,コーディング,トップページのレスポンシブ対応
2026-02-11 10:30,2026-02-11 12:00,90,B社,業務システム開発,ミーティング,
内容 形式
開始時刻 作業の開始時刻 YYYY-MM-DD HH:MM
終了時刻 作業の終了時刻 YYYY-MM-DD HH:MM
時間(分) 作業時間 分単位の整数
クライアント クライアント名 タグマスタから解決された名称
プロジェクト プロジェクト名 タグマスタから解決された名称
作業種別 作業種別名 タグマスタから解決された名称
詳細 作業の詳細メモ 未入力の場合は空欄

PWA対応

TRACEはPWA(Progressive Web App)に対応しており、スマートフォンのホーム画面にアイコンを追加してネイティブアプリのように使用できる。

項目 内容
manifest.json アプリ名、アイコン、テーマカラー、表示モード等を定義。ホーム画面への追加を可能にする
Service Worker(sw.js アプリシェル(HTML/CSS/JS)のキャッシュによる最低限のオフライン対応
ホーム画面アイコン アプリ名とアイコンをカスタマイズ可能
表示モード standalone(ブラウザのアドレスバーを非表示にし、アプリ風の外観で起動)
📱
ホーム画面への追加方法 — iOSの場合はSafariの共有ボタンから「ホーム画面に追加」を選択する。Androidの場合はChromeのメニューから「ホーム画面に追加」または「アプリをインストール」を選択する。追加後はホーム画面のアイコンからワンタップでTRACEを起動できる。

ファイル・ディレクトリ構成

TRACEのファイル・ディレクトリ構成は以下の通りである。data/ディレクトリは.htaccessによりWebからの直接アクセスが禁止されている。

/ ├── index.php # ルーティング・メイン処理 ├── api.php # API エンドポイント ├── manifest.json # PWA マニフェスト ├── sw.js # Service Worker ├── css/ │ └── style.css ├── js/ │ └── app.js # フロントエンドロジック ├── data/ ★Webから直接アクセス不可に設定 │ ├── .htaccess # アクセス制御 │ ├── config.json # 設定ファイル(PIN、メールアドレス等) │ ├── tags.json # タグマスタ │ ├── current.json # 現在の作業状態 │ └── records/ # 日別作業記録 │ ├── 20260211.json │ └── 20260212.json └── includes/ ├── auth.php # 認証処理 ├── record.php # 記録の読み書き ├── tag.php # タグ管理 └── mail.php # メール送信
ファイル/ディレクトリ 役割
index.php メインのエントリーポイント。ルーティングとHTML出力を担当
api.php フロントエンドからのAjaxリクエストを処理するAPIエンドポイント
manifest.json PWAマニフェスト。アプリ名・アイコン・テーマカラー等を定義
sw.js Service Worker。アプリシェルのキャッシュを管理
css/style.css スタイルシート
js/app.js フロントエンドのJavaScriptロジック(API通信、UI制御、タイマー等)
data/ 全データの保存先。.htaccessでWebアクセスを禁止
includes/auth.php PIN認証・セッション管理の処理
includes/record.php 作業記録のCRUD処理
includes/tag.php タグマスタの管理(追加・編集・無効化)
includes/mail.php 日次レポートメールの生成・送信処理

セキュリティ考慮事項

TRACEは個人利用を前提としたアプリケーションであるが、サーバー上で動作するため、以下のセキュリティ対策を実施している。

対策項目 内容
データディレクトリの保護 data/ディレクトリに.htaccessを設置し、Deny from allでWebからの直接アクセスを禁止する
PINコードのハッシュ化 PINコードは平文では保存せず、ハッシュ化した状態でconfig.jsonに保存する
セッション有効期限 セッションの有効期限を3時間に設定し、長時間の放置によるセッション乗っ取りリスクを軽減する
CSRF対策 フォーム送信やAPI呼び出しにCSRFトークンを導入し、クロスサイトリクエストフォージェリを防止する
入力値バリデーション すべてのユーザー入力値に対してバリデーションとサニタイズを実施し、インジェクション攻撃を防止する
🔒
data/ディレクトリの.htaccessdata/ディレクトリ内に以下の内容の.htaccessファイルを設置することで、外部からの直接アクセスをすべて遮断する。JSONファイルへのアクセスは、必ずPHPの処理を経由して行われる。
Order deny,allow
Deny from all

トラブルシューティング

PINを入力してもログインできない

作業の経過時間が表示されない

「開始」を押しても記録が開始されない

日次レポートメールが届かない

プロジェクトの選択肢が表示されない

PWAとしてインストールできない

JSONファイルの書き込みエラーが発生する

注意事項

⚠️
使用上の注意
  • TRACEは個人利用を前提として設計されている。複数ユーザーの同時利用には対応していない
  • データはJSONファイルで管理されるため、大量のデータ(数年分の記録)が蓄積されるとファイルサイズが増大する可能性がある。定期的なバックアップと古いファイルのアーカイブを推奨する
  • JSONファイルの同時書き込みに対する排他制御は簡易的なものである。同一ブラウザの複数タブでの同時操作は避けること
  • PINコードは数字のみであるため、セキュリティ強度は高くない。信頼できるネットワーク環境での使用を推奨する
  • 日次レポートメールの送信にはサーバーのmail()関数を使用するため、サーバー以外の環境ではメール送信の設定が異なる場合がある
  • Service Workerによるキャッシュはアプリシェルの最低限のキャッシュに留まる。完全なオフライン操作(作業の記録等)には対応していない
  • ブラウザのCookieを無効にしている場合、セッション管理が正しく動作せず、PIN入力画面がループする可能性がある
  • data/ディレクトリの.htaccessが正しく設置されていない場合、JSONファイルが外部から閲覧可能になるリスクがある。デプロイ後にブラウザからdata/config.jsonに直接アクセスして403エラーが返ることを必ず確認すること
  • 日付をまたいで作業を継続した場合の記録の扱い(日付の分割等)については、運用上のルールを事前に決めておくことを推奨する