A zero-dependency, ultra-lightweight database time machine for SQLite

A zero-dependency, ultra-lightweight database time machine for SQLite

An open-source, ultra-lightweight web application and CLI daemon designed to track and instantly rewind a corrupted or modified SQLite database file back to any previous state (e.g. 3 minutes ago) during local development — just like scrubbing a video.

🇹🇷 Türkçe Dokümantasyon: Türkçe rehber için lütfen README.tr.md dosyasına bakın.


⚠️ Important Note on Architecture & SQLite

​Strictly for Local Development: This tool is designed to be a zero-dependency, plug-and-play visual scrubber for single-user debugging. It uses a raw POSIX file copy/rename mechanism to achieve instant “time travel” without requiring specific PHP extensions or complex .backup commands.
​Because a local debugging environment does not experience concurrent writes, race conditions, or active traffic, this file-copy method is perfectly safe here.
​Do not use this tool or its file-copy logic in a production environment, especially if your SQLite database uses WAL (Write-Ahead Logging) mode, as copying live database files during active transactions will lead to data corruption.


🚀 Features

  • ⚡ Zero Dependencies: Built with pure PHP 8+ and Vanilla JS. Requires no heavy frameworks or npm packages.
  • 🌐 Full i18n / Multi-Language: Translation files are completely decoupled in lang/. Switch languages dynamically from the UI (e.g., 🇹🇷 Turkish, 🇬🇧 English). Easily contribute by adding or updating lang/xx.json files.
  • 💾 SQLite WAL Mode Aware: Seamlessly backs up and restores .sqlite-wal and .sqlite-shm files for databases running PRAGMA journal_mode=WAL;.
  • 🔍 Visual Data & Table Diff Viewer: Compare row counts and table changes (+3 rows in live) between any historic snapshot and your current live database before restoring.
  • 📌 Snapshot Pinning & Tagging: Pin important snapshots with one click to protect them from auto-cleanup.
  • 📥 One-Click Snapshot Export: Download any historic database state directly as a .sqlite file.
  • ⌨️ Keyboard Navigation Shortcuts: Navigate through the timeline smoothly using Left Arrow (⬅️) and Right Arrow (➡️) keys.
  • 🔄 Automatic Instant Snapshots (Watcher Daemon): Background CLI script (watcher.php) listens for modifications in database.sqlite and automatically creates timestamped snapshots (backups/1715000000_database.sqlite).
  • 🧹 Automatic Cleanup: Maintains up to 50 backups, purging older unpinned snapshots to prevent disk clutter.

📁 Project Layout

Yellow backpack with camping gear including a water bottle and folded mat near water.
Photo: MEUM MARE / Pexels

time-travel/
├── index.html        # Chrono Console UI (Tailwind CSS + Vanilla JS + i18n Engine)
├── api.php           # Snapshot listing, restoration, diff, export, and i18n API
├── watcher.php       # CLI background listener daemon script (WAL & signal aware)
├── lang.php          # Multi-language (i18n) helper class
├── lang/             # JSON language files directory
│   ├── tr.json       # Turkish language file
│   └── en.json       # English language file
├── database.sqlite   # Target SQLite database file (created automatically)
├── backups/          # Timestamped backups directory (created automatically)
├── README.md         # Primary English documentation
└── README.tr.md      # Turkish documentation & guide

🌍 Translation Guide: Adding & Updating Language Files

1. Adding a New Language

Create a JSON file inside lang/ matching the ISO code (e.g., lang/es.json, lang/de.json):

AdvertisementDon't Outlive Your Benefits — Long-Term Care insurance with unlimited LTC funds for as long as you live. Call 1-800-317-0625

{
  "code": "es",
  "name": "Español",
  "flag": "🇪🇸",
  "cli": { ... },
  "api": { ... },
  "ui":  { ... }
}

2. Updating Existing Translations

Open any file in lang/*.json and edit strings. Changes reflect immediately on the Web UI and CLI without restarting the server.

AdvertisementDon't Outlive Your Benefits — Long-Term Care insurance with unlimited LTC funds for as long as you live. Call 1-800-317-0625

💻 Installation & Usage

1. Start the Watcher Daemon (Terminal 1)

To specify custom language or database file:

php watcher.php database.sqlite en

2. Start Local Web Server (Terminal 2)

A single ultralight aircraft soaring in the clear blue sky, capturing freedom and adventure.
Photo: Ion Ceban @ionelceban / Pexels

3. Open Web Interface

Open your browser and navigate to: http://127.0.0.1:8000

AdvertisementDon't Outlive Your Benefits — Long-Term Care insurance with unlimited LTC funds for as long as you live. Call 1-800-317-0625

🧪 How to Test

  1. Open the web interface.
  2. Click “✍️ Add Test Data (DB Write)”.
  3. Observe terminal output from watcher.php:
    [+] Created snapshot: 1715000000_database.sqlite
  4. Drag the timeline slider or use ⬅️ / ➡️ arrow keys.
  5. Click “🔍 Compare Diff” to inspect table row changes.
  6. Click “⚡ Restore To This State” to rewind your database!

🔒 File Permissions (Linux / Unix)

Make sure you are inside the tool’s directory, then run:

AdvertisementDon't Outlive Your Benefits — Long-Term Care insurance with unlimited LTC funds for as long as you live. Call 1-800-317-0625

(Note: This grants the necessary read/write permissions for both your CLI and Web Server to manage the SQLite and backup files locally without friction.)


📄 License

This project is open-source under the MIT license.

Read More

Join the conversation

Your email address will not be published. Be respectful — keep it constructive.

AdvertisementDon't Outlive Your Benefits — Long-Term Care insurance with unlimited LTC funds for as long as you live. Call 1-800-317-0625
AdvertisementDon't Outlive Your Benefits — Long-Term Care insurance with unlimited LTC funds for as long as you live. Call 1-800-317-0625