Files
simple-notes-sync/CHANGELOG.md
inventory69 63af7d30dc Release v1.3.0: Multi-Device Sync with Deletion Tracking
New Features:
- Multi-Device Sync with deletion tracking (prevents zombie notes)
- Server deletion via swipe gesture with confirmation dialog
- E-Tag performance optimization (~150ms vs 3s for no-change syncs)
- Markdown Auto-Sync toggle (unified Export + Auto-Import)
- Manual Markdown sync button for performance control
- Server-Restore modes (Merge/Replace/Overwrite)

Technical Implementation:
- DeletionTracker model with JSON persistence
- Intelligent server checks with E-Tag caching
- Deletion-aware download logic
- Two-stage swipe deletion with Material Design dialog
- Automatic Markdown import during sync
- YAML frontmatter scanning for robust file deletion

Thanks to Thomas from Bielefeld for reporting the multi-device sync issue!

Compatible with: v1.2.0-v1.3.0
2026-01-07 12:27:27 +01:00

9.9 KiB

Changelog

All notable changes to Simple Notes Sync will be documented in this file.

The format is based on Keep a Changelog.


[1.3.0] - 2026-01-07

Added

  • 🚀 Multi-Device Sync (Thanks to Thomas from Bielefeld for reporting!)

    • Automatic download of new notes from other devices
    • Deletion tracking prevents "zombie notes" (deleted notes don't come back)
    • Smart cleanup: Re-created notes (newer timestamp) are downloaded
    • Works with all devices: v1.2.0, v1.2.1, v1.2.2, and v1.3.0
  • 🗑️ Server Deletion via Swipe Gesture

    • Swipe left on notes to delete from server (requires confirmation)
    • Prevents duplicate notes on other devices
    • Works with deletion tracking system
    • Material Design confirmation dialog
  • E-Tag Performance Optimization

    • Smart server checking with E-Tag caching (~150ms vs 3000ms for "no changes")
    • 20x faster when server has no updates
    • E-Tag hybrid approach: E-Tag for JSON (fast), timestamp for Markdown (reliable)
    • Battery-friendly with minimal server requests
  • 📥 Markdown Auto-Sync Toggle

    • NEW: Unified Auto-Sync toggle in Settings (replaces separate Export/Auto-Import toggles)
    • When enabled: Notes export to Markdown AND import changes automatically
    • When disabled: Manual sync button appears for on-demand synchronization
    • Performance: Auto-Sync OFF = 0ms overhead
  • 🔘 Manual Markdown Sync Button

    • Manual sync button for performance-conscious users
    • Shows import/export counts after completion
    • Only visible when Auto-Sync is disabled
    • On-demand synchronization (~150-200ms only when triggered)
  • ⚙️ Server-Restore Modes

    • MERGE: Keep local notes + add server notes
    • REPLACE: Delete all local + download from server
    • OVERWRITE: Update duplicates, keep non-duplicates
    • Restore modes now work correctly for WebDAV restore

Technical

  • New DeletionTracker model with JSON persistence
  • NotesStorage: Added deletion tracking methods
  • WebDavSyncService.hasUnsyncedChanges(): Intelligent server checks with E-Tag caching
  • WebDavSyncService.downloadRemoteNotes(): Deletion-aware downloads
  • WebDavSyncService.restoreFromServer(): Support for restore modes
  • WebDavSyncService.deleteNoteFromServer(): Server deletion with YAML frontmatter scanning
  • WebDavSyncService.importMarkdownFiles(): Automatic Markdown import during sync
  • WebDavSyncService.manualMarkdownSync(): Manual sync with result counts
  • MainActivity.setupSwipeToDelete(): Two-stage swipe deletion with confirmation
  • E-Tag caching in SharedPreferences for performance

[1.2.2] - 2026-01-06

Fixed

  • Backward Compatibility for v1.2.0 Users (Critical)
    • App now reads BOTH old (Root) AND new (/notes/) folder structures
    • Users upgrading from v1.2.0 no longer lose their existing notes
    • Server-Restore now finds notes from v1.2.0 stored in Root folder
    • Automatic deduplication prevents loading the same note twice
    • Graceful error handling if Root folder is not accessible

Technical

  • WebDavSyncService.downloadRemoteNotes() - Dual-mode download (Root + /notes/)
  • WebDavSyncService.restoreFromServer() - Now uses dual-mode download
  • Migration happens naturally: new uploads go to /notes/, old notes stay readable

[1.2.1] - 2026-01-05

Fixed

  • Markdown Initial Export Bugfix

    • Existing notes are now exported as Markdown when Desktop Integration is activated
    • Previously, only new notes created after activation were exported
    • Progress dialog shows export status with current/total counter
    • Error handling for network issues during export
    • Individual note failures don't abort the entire export
  • Markdown Directory Structure Fix

    • Markdown files now correctly land in /notes-md/ folder
    • Smart URL detection supports both Root-URL and /notes URL structures
    • Previously, MD files were incorrectly placed in the root directory
    • Markdown import now finds files correctly
  • JSON URL Normalization

    • Simplified server configuration: enter only base URL (e.g., http://server:8080/)
    • App automatically creates /notes/ for JSON files and /notes-md/ for Markdown
    • Smart detection: both http://server:8080/ and http://server:8080/notes/ work correctly
    • Backward compatible: existing setups with /notes in URL continue to work
    • No migration required for existing users

Changed

  • Markdown Directory Creation

    • notes-md/ folder is now created on first sync (regardless of Desktop Integration setting)
    • Prevents 404 errors when mounting WebDAV folder
    • Better user experience: folder is visible before enabling the feature
  • Settings UI Improvements

    • Updated example URL from /webdav to /notes to match app behavior
    • Example now shows: http://192.168.0.188:8080/notes

Technical

  • WebDavSyncService.ensureMarkdownDirectoryExists() - Creates MD folder early
  • WebDavSyncService.getMarkdownUrl() - Smart URL detection for both structures
  • WebDavSyncService.exportAllNotesToMarkdown() - Exports all local notes with progress callback
  • SettingsActivity.onMarkdownExportToggled() - Triggers initial export with ProgressDialog

1.2.0 - 2026-01-04

Added

  • Local Backup System

    • Export all notes as JSON file to any location (Downloads, SD card, cloud folder)
    • Import backup with 3 modes: Merge, Replace, or Overwrite duplicates
    • Automatic safety backup created before every restore
    • Backup validation (format and version check)
  • Markdown Desktop Integration

    • Optional Markdown export parallel to JSON sync
    • .md files synced to notes-md/ folder on WebDAV
    • YAML frontmatter with id, created, updated, device
    • Manual import button to pull Markdown changes from server
    • Last-Write-Wins conflict resolution via timestamps
  • Settings UI Extensions

    • New "Backup & Restore" section with local + server restore
    • New "Desktop Integration" section with Markdown toggle
    • Universal restore dialog with radio button mode selection

Changed

  • Server Restore Behavior: Users now choose restore mode (Merge/Replace/Overwrite) instead of hard-coded replace-all

Technical

  • BackupManager.kt - Complete backup/restore logic
  • Note.toMarkdown() / Note.fromMarkdown() - Markdown conversion with YAML frontmatter
  • WebDavSyncService - Extended for dual-format sync (JSON master + Markdown mirror)
  • ISO8601 timestamp formatting for desktop compatibility
  • Filename sanitization for safe Markdown file names

Documentation


1.1.2 - 2025-12-28

Fixed

  • "Job was cancelled" Error

    • Fixed coroutine cancellation in sync worker
    • Proper error handling for interrupted syncs
  • UI Improvements

    • Back arrow instead of X in note editor (better UX)
    • Pull-to-refresh for manual sync trigger
    • HTTP/HTTPS protocol selection with radio buttons
    • Inline error display (no toast spam)
  • Performance & Battery

    • Sync only on actual changes (saves battery)
    • Auto-save notifications removed
    • 24-hour server offline warning instead of instant error

Changed

  • Settings grouped into "Auto-Sync" and "Sync Interval" sections
  • HTTP only allowed for local networks (RFC 1918 IPs)
  • Swipe-to-delete without UI flicker

1.1.1 - 2025-12-27

Fixed

  • WiFi Connect Sync
    • No error notifications in foreign WiFi networks
    • Server reachability check before sync (2s timeout)
    • Silent abort when server offline
    • Pre-check waits until network is ready
    • No errors during network initialization

Changed

  • Notifications
    • Old sync notifications cleared on app start
    • Error notifications auto-dismiss after 30 seconds

UI

  • Sync icon only shown when sync is configured
  • Swipe-to-delete without flicker
  • Scroll to top after saving note

Technical

  • Server check with 2-second timeout before sync attempts
  • Network readiness check in WiFi connect trigger
  • Notification cleanup on MainActivity.onCreate()

1.1.0 - 2025-12-26

Added

  • Configurable Sync Intervals

    • User choice: 15, 30, or 60 minutes
    • Real-world battery impact displayed (15min: ~0.8%/day, 30min: ~0.4%/day, 60min: ~0.2%/day)
    • Radio button selection in settings
    • Doze Mode optimization (syncs batched in maintenance windows)
  • About Section

    • App version from BuildConfig
    • Links to GitHub repository and developer profile
    • MIT license information
    • Material 3 card design

Changed

  • Settings UI redesigned with grouped sections
  • Periodic sync updated dynamically when interval changes
  • WorkManager uses selected interval for background sync

Removed

  • Debug/Logs section from settings (cleaner UI)

Technical

  • PREF_SYNC_INTERVAL_MINUTES preference key
  • NetworkMonitor reads interval from SharedPreferences
  • ExistingPeriodicWorkPolicy.UPDATE for live interval changes

1.0.0 - 2025-12-25

Added

  • Initial release
  • WebDAV synchronization
  • Note creation, editing, deletion
  • 6 sync triggers:
    • Periodic sync (configurable interval)
    • App start sync
    • WiFi connect sync
    • Manual sync (menu button)
    • Pull-to-refresh
    • Settings "Sync Now" button
  • Material 3 design
  • Light/Dark theme support
  • F-Droid compatible (100% FOSS)