From 467b7dcd1a809839025fe33773caf13fb8b9dc9b Mon Sep 17 00:00:00 2001 From: Leopere Date: Sun, 19 Oct 2025 16:33:55 -0400 Subject: [PATCH] Completely simplify ScanSnap story page - Removed all technical WebDAV details and jargon - Made the URL http://192.168.0.119:9876 more prominent - Simplified the page to focus on how to use the scanner service - Added clear step-by-step instructions for connecting and scanning - Removed unnecessary code examples and technical implementation details --- docker/resume/stories/scansnap-webdav.html | 224 +++++---------------- 1 file changed, 46 insertions(+), 178 deletions(-) diff --git a/docker/resume/stories/scansnap-webdav.html b/docker/resume/stories/scansnap-webdav.html index 6d5f4f2..f137347 100644 --- a/docker/resume/stories/scansnap-webdav.html +++ b/docker/resume/stories/scansnap-webdav.html @@ -3,8 +3,8 @@ - - ScanSnap WebDAV Service - Colin Knapp Portfolio + + ScanSnap Scanner Service - Colin Knapp Portfolio @@ -19,222 +19,90 @@ ← Back to Portfolio -

ScanSnap WebDAV Service for buildersclub.ca

+

ScanSnap Scanner Service for buildersclub.ca

Timeframe: 2025-Present

-

Role: Full-Stack Developer & DevOps Engineer

-

Technologies: Python, WebDAV, WsgiDAV, macOS Integration

+

Role: Developer

+

Technologies: Python, macOS Integration

Client: buildersclub.ca


-

The Challenge

+

Scanner Service Overview

- Running a business means dealing with receipts. Lots of them. And for buildersclub.ca members juggling multiple projects, - managing receipt documentation was becoming a serious time sink. Traditional scanning workflows involved multiple steps: - scan, save, organize, upload. Multiply that by dozens of receipts, and you're looking at hours of manual work every week. + For buildersclub.ca members, I created a simple network scanner endpoint that makes digitizing receipts and documents fast and easy. + The service is available at http://192.168.0.119:9876 on the clubhouse network.

-

- I needed a solution that could handle the club's Fujitsu ScanSnap iX1500 scanner—a beast of a machine capable of digitizing - 50 receipts at nearly one scan per second—but without the usual friction of file management systems. -

-
-

What We Built

-

- A custom WebDAV server optimized specifically for high-speed document scanning. Load 50 receipts, hit scan, - and watch them all digitize in under a minute. Files are immediately accessible via macOS Finder (just like - a network drive), with automatic daily cleanup to prevent storage bloat. Zero maintenance required. -

+

Key Features

    -
  • Processing Speed: ~1 receipt per second
  • +
  • Fast Processing: ~1 receipt per second
  • Batch Capacity: Up to 50 documents at once
  • -
  • File Access: Native Finder integration
  • -
  • Cleanup: Automated daily at 3:00 AM
  • -
  • Network Protocol: WebDAV 1.0/2.0 compliant
  • +
  • Simple Access: Just press Command+K in Finder and enter the URL
  • +
  • Automatic Cleanup: Files are automatically removed at 3:00 AM daily
  • +
  • Zero Maintenance: No user management required

- For buildersclub.ca members: Access the scanner service here (clubhouse network only) + Access URL: http://192.168.0.119:9876 (clubhouse network only)

-
-

The Technical Journey

+
+

How It Works

+ +

Simple Setup

+
    +
  1. Connect to the clubhouse network
  2. +
  3. Press Command+K in Finder
  4. +
  5. Enter http://192.168.0.119:9876
  6. +
  7. Click "Connect"
  8. +
  9. The scanner folder appears in Finder
  10. +
+ +

Scanning Process

+
    +
  1. Load documents into the ScanSnap scanner
  2. +
  3. Select the network folder as the destination
  4. +
  5. Press scan
  6. +
  7. Documents appear in the folder instantly
  8. +
  9. Copy or move files as needed
  10. +
-

Simple Network Scanner Access

- The system provides a straightforward network location where the ScanSnap scanner can send documents directly. - Just connect with Command+K in Finder, enter the URL, and you have instant access to a network drive ready for scanning. + Note: All files are automatically deleted at 3:00 AM daily to keep the system clean. + Make sure to copy important files to your own storage before then.

-

- This creates a seamless experience - load your documents, hit scan, and they're immediately available on your computer - without any additional steps or software. -

- -

Security Without the Headache

-

- Here's the thing about receipt scanners: you want them to be fast and frictionless. Authentication dialogs kill that flow. - But you also can't just leave a wide-open file server exposed to the internet. -

-

- The solution? Custom permissions at the protocol level. The scanner can upload files and delete them when needed, - but it can't move, copy, or rename anything. More importantly, the service is completely isolated to its own directory—there's - literally no way for it to access files outside ~/scansnap-dav/scans, even if someone tried to hack around it. -

-
class ScanSnapProvider(FilesystemProvider):
-    def create_collection(self, path):
-        # No creating subdirectories
-        raise DAVError(403, "Creating directories not allowed")
-    
-    def copy_resource(self, src_path, dest_path, depth):
-        # No copying files around
-        raise DAVError(403, "Copying not allowed")
-    
-    def move_resource(self, src_path, dest_path):
-        # No moving or renaming
-        raise DAVError(403, "Moving/renaming not allowed")
-

- For the clubhouse environment, this works perfectly. It's on a trusted network, accessible only to members, - and the restricted permissions mean there's no risk of accidentally messing up the file system. -

- -

The Storage Problem Nobody Thinks About

-

- When you're scanning 50 receipts at a time, storage fills up fast. Even with PDF compression, you're looking at - several megabytes per scan session. Do that a few times a day, and suddenly you're managing gigabytes of receipt data. -

-

- The fix? Automatic cleanup. Every night at 3 AM, a Python scheduler wipes the scans directory clean. Receipts - are meant to be temporary anyway—scan them, grab what you need, move on. The cleanup runs silently in the background, - and members never have to think about storage management. -

-
def cleanup_scans():
-    scans_dir = os.path.expanduser("~/scansnap-dav/scans")
-    for filename in os.listdir(scans_dir):
-        file_path = os.path.join(scans_dir, filename)
-        if os.isfile(file_path):
-            os.remove(file_path)
-
-# Daily cleanup at 3:00 AM
-schedule.every().day.at("03:00").do(cleanup_scans)
-

Real-World Impact

+

Benefits

-

From Hours to Minutes

-

- Before this system, processing a week's worth of receipts meant: -

-
    -
  1. Scan receipts one by one (or in small batches)
  2. -
  3. Wait for files to save to the local machine
  4. -
  5. Open file manager and organize scans
  6. -
  7. Upload to cloud storage or accounting software
  8. -
  9. Clean up local copies to free up space
  10. -
-

- That's easily 20-30 minutes of manual work for a typical batch of receipts. -

-

- Now? Load the scanner hopper, hit scan, wait 60 seconds, grab the PDFs from Finder. Done. The time savings - are dramatic—what used to take half an hour now takes maybe two minutes. -

- -

The Numbers

    -
  • Time Reduction: 95% decrease in manual document processing
  • -
  • Batch Efficiency: 50 receipts in under 60 seconds
  • -
  • Storage Overhead: Zero (automated cleanup handles everything)
  • -
  • User Training Required: Literally just "Command+K, enter the URL"
  • +
  • Time Savings: 95% reduction in document processing time
  • +
  • Efficiency: Process 50 receipts in under 60 seconds
  • +
  • Simplicity: No special software or training needed
  • +
  • Reliability: Automatic maintenance keeps the system running smoothly
- -

Why It Works

-

- The beauty of this solution is its simplicity. There's no complex web interface, no database, no authentication system - to maintain. It's just a WebDAV endpoint that does exactly what the scanner needs and nothing more. -

-

- For buildersclub.ca members, it means one less thing to think about. Receipts get scanned, files are immediately - available, and storage never becomes an issue. The system just works, quietly and reliably, in the background. -

-
- -
-

Under the Hood

-

The Tech Stack

-
    -
  • Server Framework: WsgiDAV with Cheroot WSGI server
  • -
  • Language: Python 3.13+
  • -
  • Automation: Python schedule library for cleanup
  • -
  • macOS Integration: launchd for auto-start on boot
  • -
  • Protocol: WebDAV with macOS-specific optimizations
  • -
- -

Key Configuration

-
config = {
-    "host": "0.0.0.0",
-    "port": 9876,
-    "provider_mapping": {
-        "/": ScanSnapProvider(scans_dir)
-    },
-    "hotfixes": {
-        "emulate_win32_lastmod": True,
-        "unquote_path_info": True,
-        "win_accept_anonymous": True,
-    },
-    "property_manager": True,
-    "lock_storage": True,
-}
- -

Security Considerations

-
    -
  • Network Scope: Clubhouse network only, no internet exposure
  • -
  • File Isolation: Cannot access anything outside the scans directory
  • -
  • Operation Restrictions: Upload, read, and delete only—no move/copy/rename
  • -
  • Authentication: None required (trusted network environment)
  • -
-
- -
-

Lessons Learned

- -

Sometimes Simple is Better

- I could have built a full web application with user accounts, file organization features, OCR processing, - automatic categorization, cloud sync... but none of that was actually needed. The scanner needed a place to - dump files quickly, and users needed to grab those files easily. Mission accomplished with a fraction of the complexity. -

- -

Simple Network Integration

-

- The solution integrates directly with macOS Finder, making it immediately familiar to users without requiring - any special software or training. Connect once, and the scanner endpoint is always ready to receive your documents. -

- -

Automatic Cleanup Changes Everything

-

- The daily cleanup feature turned this from a "nice to have" into a "set it and forget it" solution. Nobody - thinks about storage, nobody worries about running out of space, and the system stays lean indefinitely. + This simple solution dramatically reduces the time buildersclub.ca members spend on receipt management, + allowing them to focus on their projects instead of paperwork.


@@ -242,4 +110,4 @@ schedule.every().day.at("03:00").do(cleanup_scans) - + \ No newline at end of file