Deep storage auditing for Google Drive โ part of the Docto Trace suite.
Project description
๐ docto-trace-storage
Deep storage auditing for Google Drive.
Part of the Docto Trace open-source suite.
What is this?
docto-trace-storage is a high-performance, open-source data auditing tool. It is the first module of the Docto Trace suite, designed to map and analyze "digital chaos" across cloud storage providers (starting with Google Drive). The goal is to provide deep visibility into storage structures, identifying digital dementia (orphaned files, zombies, and duplicates) to prepare organizations for AI-readiness and Centralized Memory โ all safely from your own machine.
Read-Only, always. The tool never modifies or deletes files. It only observes and reports.
Your data stays local. The Drive API is called directly from your machine. No data passes through any Docto infrastructure.
Installation & Quick Start
The fastest way to get started is using the onboard command. It will guide you through creating a virtual environment, installing dependencies, setting up Google Cloud credentials, and running your first scan.
# 1. Clone the repository
git clone https://github.com/Docto-Studio/docto-trace-storage.git
cd docto-trace-storage
# 2. Run the onboarding wizard
pip install -e .
docto-trace onboard
The wizard will handle:
- Environment check (offering to create a
.venv/) - Dependency installation (including the optional Interactive UI)
- Google Cloud setup (guiding you through creating your own
credentials.json) - Authentication (logging into your Google Drive)
- AI-Readiness (configuring an LLM provider like OpenAI or Anthropic)
- Initial Scan (launching the dashboard immediately)
Features
| Feature | Status |
|---|---|
| Google Drive OAuth2 authentication | โ v0.1 |
| Service Account support | โ v0.1 |
| Async recursive folder traversal | โ v0.1 |
| True cumulative folder sizes | โ v0.1 |
| Top-N largest folders (root excluded) | โ v0.1 |
| Deep folder detection | โ v0.1 |
report.json export (strict Pydantic schema) |
โ v0.1 |
| Rich terminal summary | โ v0.1 |
| ๐ง Digital Dementia detection (stale > N months) | โ v0.2 |
| โป๏ธ Content deduplication (MD5 + fallback) | โ v0.2 |
| Duplicate file path tracing | โ v0.2 |
๐ Modern Streamlit Dashboard UI (--ui) |
โ v0.2 |
Actionable remediation action_plan |
โ v0.2 |
| Bundled credentials (zero-setup for end users) | โ v0.2 |
Bring Your Own Credentials (setup wizard) |
โ v0.2 |
login / logout auth lifecycle |
โ v0.2 |
Claude Skill (AI-native interface)
docto-trace-storage ships with a ready-to-use Claude Skill that lets you audit your Google Drive through natural language โ no terminal required.
User โ "Scan my Drive and find what's wasting space"
Claude โ runs docto-trace scan โ analyses report.json โ responds with insights
The Skill actively invokes the CLI on your machine via a thin subprocess wrapper. It follows the exact same read-only guarantee as the CLI itself.
Install the Skill
# 1. Package the skill
cd skill/
zip -r docto-trace-storage.zip docto-trace-storage/
# 2. Upload to Claude โ claude.ai/customize/skills
Enterprise admins can provision the Skill org-wide via Admin โ Customize โ Skills.
See skill/README_SKILL.md for the full deployment guide.
Example prompts
| Prompt | What happens |
|---|---|
| "Scan my Google Drive" | Full audit, default settings |
| "Find duplicate files in my Drive" | Scan + filter to duplicate groups |
| "Which files haven't been touched in 3 years?" | Scan with --stale-threshold 36 |
| "Show me my 20 largest folders" | Scan with --top 20 |
The CLI (
pip install docto-trace-storage) works fully standalone โ the Skill is an additive layer that delegates 100% to it.
Trust & Privacy
Are you handing your private Drive to a stranger's app? No.
- Read-only scopes only โ the OAuth2 consent grants only
drive.readonlyanddrive.metadata.readonly. The API physically cannot write, move, or delete anything. - 100% local execution โ your credentials, your token, and your Drive data never leave your machine. There is no Docto backend, no telemetry, no analytics.
- Bring Your Own Credentials โ you can create your own Google Cloud project and register your own OAuth2 app in ~5 minutes. Your token is then issued against your GCP project, which you control fully.
# Create your own GCP credentials (interactive wizard)
docto-trace setup
See Using Your Own Google Cloud Credentials for the full guide.
Installation
For end users (zero setup)
The package ships with Docto's OAuth2 credentials bundled inside. Install from PyPI and scan โ the browser consent screen is the only step needed.
# Install from PyPI
pip install docto-trace-storage
# Scan immediately โ no credentials.json needed
docto-trace scan
From source (contributors / developers)
git clone https://github.com/Docto-Studio/docto-trace-storage.git
cd docto-trace-storage
# Install editable with dev tools
pip install -e ".[dev]"
Build your own wheel
python -m build --wheel
# โ dist/docto_trace_storage-0.2.1-py3-none-any.whl
Requirements: Python 3.10+
Quick Start
# Check version
docto-trace --version # โ docto-trace-storage v0.2.1
# Option A โ Zero setup (uses bundled Docto credentials)
docto-trace scan # browser opens for OAuth2 consent on first run
# Option B โ Full control (your own GCP project)
docto-trace setup # guided 4-step wizard
docto-trace login # authenticate
docto-trace scan # run audit
docto-trace logout # clear session
CLI Reference
docto-trace ui
Launches a modern, sleek, interactive Streamlit dashboard to visualize the generated report.json. Features a beautiful Dark Theme, Top 10 folder grid, precise data storage metrics, and actionable item tables for addressing Digital Dementia.
docto-trace ui output/report.json
docto-trace --version / -v
docto-trace --version # docto-trace-storage v0.2.1
docto-trace -v # same
docto-trace setup
Interactive 4-step wizard to create your own Google Cloud project and OAuth2 credentials. Run this once if you want full control over the app registration.
docto-trace setup
docto-trace setup --output ~/my-creds.json
docto-trace login
Authenticate with Google Drive and cache the token locally. Subsequent commands reuse the cached token silently.
docto-trace login
docto-trace login --credentials ./my-credentials.json
docto-trace login --service-account ./sa-key.json # skip browser flow
docto-trace logout
Delete the cached token. The next scan or login will trigger a fresh browser flow.
docto-trace logout
docto-trace logout --revoke # also revoke on Google's servers
docto-trace scan
The core command. Traverses Google Drive, runs all audits, and produces report.json.
# Full scan with defaults
docto-trace scan
# Scan and automatically launch the interactive UI dashboard
docto-trace scan --ui
# Narrow to a specific folder by Drive ID
docto-trace scan --root-id 1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms
# Cap depth, show top 20, custom output dir
docto-trace scan --max-depth 5 --top 20 --output ./reports/
# Zombie threshold: flag files not modified in 12 months (default: 24)
docto-trace scan --stale-threshold 12
# Use your own credentials file
docto-trace scan --credentials ./my-credentials.json
# Use a service account (no browser flow)
docto-trace scan --service-account ./sa-key.json
| Flag | Default | Description |
|---|---|---|
--root-id / -r |
root |
Drive folder ID to start from |
--max-depth / -d |
unlimited | Max folder depth to traverse |
--top / -n |
10 |
Top-N largest folders to show |
--deep-threshold |
5 |
Depth to flag as "deep" |
--stale-threshold / -S |
24 |
Months without modification = zombie |
--credentials / -c |
credentials.json |
OAuth2 credentials file |
--output / -o |
output/ |
Directory for report.json |
--ui / --no-ui |
--no-ui |
Auto-launch Streamlit dashboard |
--service-account / -s |
(none) | Service account key path |
Terminal Output Example
๐ Authenticating with Google Driveโฆ
โน๏ธ Using Docto bundled credentials. Run docto-trace setup to use your own.
๐ Opening browser for Google Drive authorizationโฆ โ first run only
๐ Scanning: My Drive
โ Traversing foldersโฆ [00:18]
โโโโโโโโโโโโโโโ ๐ฆ Storage Overview โโโโโโโโโโโโโโโ
Root: My Drive
Total files: 14,832
Total folders: 1,204
Total size: 48.3 GB
Max depth: 9
โโโโโโโโโโโโโโโ ๐ Top 10 Largest Folders โโโโโโโโโโโโโโโ
Rank Folder Path Files Size
1 Projects My Drive/Projects 8,241 31.2 GB
2 Archive My Drive/Archive 3,102 10.5 GB
โโโโโโโโโโโโโโโ ๐ง Zombie Files (381 stale) โโโโโโโโโโโโโโโ
File Path Last Modified Size
old_invoice.pdf My Drive/Finance/old_invoice.pdf 2020-01-15 2.1 MB
โโโโโโโโโโโโโโโ โป๏ธ Duplicate Groups (70 groups ยท 104 MB wasted) โโโโโโโโโโโโโโโ
Fingerprint Path Size/copy Wasted
c8cd4fe0ab7a7fe8โฆ My Drive/Backup/8CDA554Bโฆmov 12.0 MB 12.0 MB
(2 copies) My Drive/Photos/8CDA554Bโฆmov
โโโโโโโโโโโโโโโโ โ
Report saved โโโโโโโโโโโโโโโโ
Output: output/report.json
Report Schema (v0.2.1)
The output report.json follows the HealthReport Pydantic schema:
{
"schema_version": "0.2.1",
"generated_at": "2026-03-23T10:00:00Z",
"storage_tree": { "root_name": "My Drive", "total_files": 14832, "total_size_bytes": 51876044800 },
"insights": {
"top_folders": [...],
"deep_folders": [...]
},
"zombies": [
{ "file_id": "...", "name": "old_invoice.pdf", "path": "My Drive/Finance/old_invoice.pdf",
"last_modified": "2020-01-15T10:30:00Z", "size_bytes": 2202009, "reason": "stale" }
],
"duplicates": [
{ "fingerprint": "c8cd4fe0โฆ", "files": ["id1", "id2"],
"file_names": ["invoice_final.pdf", "invoice_copy.pdf"],
"file_paths": ["My Drive/Docs/invoice_final.pdf", "My Drive/Backup/invoice_copy.pdf"],
"size_bytes_per_copy": 2097152, "wasted_bytes": 2097152 }
],
"action_plan": [
{ "severity": "warning", "category": "zombie", "description": "..." },
{ "severity": "critical", "category": "duplicate", "description": "..." }
]
}
Deduplication strategy:
- Primary key โ
md5Checksumfrom the Drive API (binary files: PDFs, images, Office docs) - Fallback key โ
"<size_bytes>:<normalized_name>"for Google-native files (Docs, Sheets, Slides)
Using Your Own Google Cloud Credentials
If you want full control over the OAuth2 app registration โ so your consent screen, quotas, and audit logs belong entirely to you โ run the setup wizard:
docto-trace setup
It walks you through 4 steps, opening each Google Cloud Console page in your browser:
- Create a GCP project โ gives you ownership of the app
- Enable the Google Drive API โ only the two read-only scopes
- Configure the OAuth2 consent screen โ add yourself as a test user
- Download
credentials.jsonโ the wizard validates it locally
Then authenticate with your own credentials:
docto-trace login --credentials ./credentials.json
docto-trace scan --credentials ./credentials.json
You can revoke access at any time from Google Cloud Console โ Credentials, independently of the Docto project.
Configuration
All settings can be overridden with environment variables prefixed DOCTO_TRACE_, or in a .env file:
| Variable | Default | Description |
|---|---|---|
DOCTO_TRACE_CREDENTIALS_PATH |
credentials.json |
OAuth2 credentials file |
DOCTO_TRACE_TOKEN_PATH |
token.json |
Cached token path |
DOCTO_TRACE_SERVICE_ACCOUNT_PATH |
(none) | Service account key path |
DOCTO_TRACE_MAX_DEPTH |
(unlimited) | Max folder nesting to traverse |
DOCTO_TRACE_DEEP_FOLDER_THRESHOLD |
5 |
Depth to flag as "deep" |
DOCTO_TRACE_TOP_N |
10 |
Top-N largest folders |
DOCTO_TRACE_STALE_THRESHOLD_MONTHS |
24 |
Zombie detection cutoff (months) |
DOCTO_TRACE_OUTPUT_DIR |
output/ |
Report output directory |
DOCTO_TRACE_PAGE_SIZE |
1000 |
Drive API items per page |
Development
make install # Install with dev dependencies
make lint # Lint with ruff
make fix # Auto-fix lint issues
make test # Run unit tests (no credentials needed)
make typecheck # Run mypy
Tests run entirely offline โ no Google credentials required:
python -m pytest tests/ -v
# 48 passed in 0.18s
Architecture
docto_trace/
โโโ cli.py # Typer root entry point
โโโ config.py # Pydantic settings (env-var overridable)
โโโ data/
โ โโโ credentials.json # Bundled Docto OAuth2 credentials (package resource)
โโโ auth/
โ โโโ google_drive.py # OAuth2 + service account flow (bundled fallback)
โ โโโ token_store.py # Token serialization
โโโ connectors/
โ โโโ base.py # AbstractConnector interface
โ โโโ google_drive.py # Drive API (async, paginated, thread-safe)
โโโ engine/
โ โโโ traversal.py # Iterative BFS tree builder (bounded concurrency)
โ โโโ analytics.py # Phase 1: top-N, deep-folder analytics
โ โโโ auditor.py # Phase 2: zombie detection + deduplication
โโโ schemas/
โ โโโ storage.py # FileNode, FolderNode, StorageTree
โ โโโ report.py # HealthReport, ZombieFile, DuplicateGroup, โฆ
โโโ commands/
โโโ setup.py # `docto-trace setup` โ BYOC wizard
โโโ login.py # `docto-trace login` โ OAuth2 flow
โโโ logout.py # `docto-trace logout` โ clear token
โโโ scan.py # `docto-trace scan` โ core audit command
โโโ report.py # `docto-trace report` โ extended report (v0.3)
Key design decisions:
- Bundled credentials โ
docto_trace/data/credentials.jsonis shipped inside the wheel viaimportlib.resources, enabling zero-setup for end users. Technical users override with--credentialsordocto-trace setup. - Schema-first โ all data models defined in Pydantic before any logic is written;
report.jsonis machine-readable by other Docto modules. - Pure audit functions โ
analytics.pyandauditor.pyare pure functions with no I/O; trivially unit-testable without credentials. - Iterative BFS traversal โ avoids Python stack overflows on large Drives; bounded to
MAX_CONCURRENT=20parallel API calls viaasyncio.Semaphore. - Thread-safe HTTP โ each thread-pool worker gets its own
httplib2.Httpviathreading.local, preventing socket corruption.
Roadmap
| Version | Focus |
|---|---|
| v0.1 | Structural mapping โ folder sizes, deep nesting |
| v0.2 | Data hygiene โ digital dementia detection, deduplication, Streamlit UI dashboard, auth lifecycle |
| v0.3 | Extended reporting โ owner analysis, sharing audit, cost estimation |
| v0.4 | AI readiness score โ structured/unstructured ratio, naming entropy |
License
Apache 2.0 ยฉ Docto Studio
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file docto_trace_storage-0.2.3.tar.gz.
File metadata
- Download URL: docto_trace_storage-0.2.3.tar.gz
- Upload date:
- Size: 94.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a1792e4cccb3978e92805da1f81945524b4e5981fe3ca7bfb2a4f64a38c6667f
|
|
| MD5 |
a5d9e0e21b076007870b8439c9b1f7ba
|
|
| BLAKE2b-256 |
56c6fa674075f4a684024e31810597bd01a8f449ff12fa1e2458607ba522799a
|
File details
Details for the file docto_trace_storage-0.2.3-py3-none-any.whl.
File metadata
- Download URL: docto_trace_storage-0.2.3-py3-none-any.whl
- Upload date:
- Size: 66.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.15
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6fcd7c246e5762cd2364e88a6c852bfa557ee8b5b6d1e49e68b3f5b3a96fe02c
|
|
| MD5 |
8158012c9a2aa9a5cfb8f62912a11fd8
|
|
| BLAKE2b-256 |
07414c1ffc7ba56d09e59e3d1f531f42db9070bcf91bd464eae7430127362fb0
|