Your life and business on autopilot. Local-first, agent-driven, human-in-the-loop.
Digital FTE (Full-Time Equivalent) is a personal AI employee system that autonomously manages personal and business affairs 24/7. It uses Qwen Code as the reasoning engine and Obsidian as the knowledge dashboard, with lightweight Python "Watcher" scripts monitoring inputs (Gmail, WhatsApp, filesystems) and FastMCP servers handling external actions.
This repository implements the Silver Tier with all Bronze features plus:
- All Bronze requirements (vault, watchers, Qwen integration)
- Two or more Watcher scripts (Gmail + WhatsApp + Filesystem)
- Automatically Post on LinkedIn (via MCP server with approval workflow)
- Qwen reasoning loop that creates Plan.md files
- Working MCP servers built using FastMCP (Email + LinkedIn)
- Human-in-the-loop approval workflow for sensitive actions
- Basic scheduling via Task Scheduler integration
- All AI functionality as Agent Skills
| Software | Version | Purpose |
|---|---|---|
| Qwen Code | Latest | Reasoning engine |
| Obsidian | v1.10.6+ | Knowledge dashboard |
| Python | 3.13+ | Watcher scripts & MCP servers |
| UV | Latest | Python package manager |
| Node.js | v24+ LTS | MCP servers (optional) |
cd G:\digital-fte
# Activate virtual environment (Windows)
.venv\Scripts\activate
# Sync UV environment
uv sync
# Install Playwright browsers
uv run playwright install chromium# Copy environment template
copy .env.example .env
# Edit .env with your settings
# IMPORTANT: Set DRY_RUN=false for production use# Download credentials.json from Google Cloud Console
# Place in ~/.gmail_watcher/credentials.json
# First run will auto-authenticate
uv run python -m GmailWatcher.main --vault ./vaultFile β Open Vault β Select G:\digital-fte\vault
# Activate virtual environment
.venv\Scripts\activate
# Check system status
uv run python -m Orchestrator.main status
# Start all watchers
uv run python -m Orchestrator.main start
# Process files with Qwen (interactive mode - requires approval)
uv run python -m Orchestrator.main process
# Process files with Qwen (autonomous mode - auto-approves actions)
uv run python -m Orchestrator.main process --yoloG:\digital-fte\
βββ README.md # This file
βββ doc.md # Full architectural blueprint
βββ pyproject.toml # UV project configuration
βββ .env.example # Environment variables template
βββ .agents/
β βββ skills/
β βββ fastmcp/
β βββ templates/ # FastMCP server templates
βββ mcp-servers/
β βββ email/
β β βββ server.py # Email MCP server (FastMCP)
β βββ linkedin/
β βββ server.py # LinkedIn MCP server (FastMCP)
βββ scripts/
β βββ base_watcher.py # Base class for all watchers
β βββ gmail_watcher.py # Gmail monitoring
β βββ filesystem_watcher.py # File drop monitoring
β βββ WhatsappWatcher # WhatsApp Web monitoring
β βββ orchestrator.py # Main coordinator + Ralph loop
β βββ mcp-client.py # MCP client helper
βββ vault/ # Obsidian vault
βββ Dashboard.md # Real-time status
βββ Company_Handbook.md # Rules of engagement
βββ Business_Goals.md # Objectives & metrics
βββ Inbox/
β βββ Drop/ # Drop files here for processing
βββ Needs_Action/ # Items requiring processing
βββ In_Progress/ # Claimed tasks
βββ Pending_Approval/ # Human-in-the-loop approvals
βββ Approved/ # User-approved actions
βββ Done/ # Completed tasks
βββ Plans/ # Generated plans
βββ Briefings/ # CEO briefing reports
βββ Accounting/ # Transaction logs
βββ Logs/ # System logs
Create a .env file in the project root:
# ===========================================
# VAULT CONFIGURATION
# ===========================================
VAULT_PATH=./vault
# ===========================================
# OPERATION MODE
# ===========================================
# Dry Run Mode: Set to 'true' to test without real actions
# Set to 'false' for production use
DRY_RUN=false
# ===========================================
# GMAIL WATCHER (Optional)
# ===========================================
# Path to Gmail OAuth credentials (downloaded from Google Cloud Console)
# Get credentials from: https://developers.google.com/gmail/api/quickstart/python
GMAIL_CREDENTIALS_PATH=~/.gmail_watcher/credentials.json
# Path to Gmail OAuth token (auto-generated after first auth)
GMAIL_TOKEN_PATH=~/.gmail_watcher/token.json
# ===========================================
# WHATSAPP WATCHER
# ===========================================
WHATSAPP_SESSION_PATH=~/.digital_fte/sessions/whatsapp
CHECK_INTERVAL=30
WHATSAPP_KEYWORDS=urgent,asap,invoice,payment,help
# ===========================================
# LINKEDIN POSTING
# ===========================================
LINKEDIN_EMAIL=your.email@example.com
LINKEDIN_PASSWORD=your_password
PLAYWRIGHT_HEADLESS=true
# ===========================================
# ORCHESTRATOR
# ===========================================
MAX_ITERATIONS=10# Activate virtual environment first
.venv\Scripts\activate
# Start all watchers (runs in background)
uv run python -m Orchestrator.main start
# Start specific watchers
uv run python -m Orchestrator.main start --watchers filesystem whatsapp
# Start Gmail watcher (if configured)
uv run python -m GmailWatcher.main --vault ./vault
# Start filesystem watcher (monitors vault/Inbox/Drop)
uv run python -m FilesystemWatcher.main --vault ./vault
# Start Email MCP server (stdio transport for Qwen Code)
uv run python mcp-servers/email/server.py
# Start LinkedIn MCP server (stdio transport for Qwen Code)
uv run python mcp-servers/linkedin/server.py
# Or with HTTP transport (for external access)
uv run python mcp-servers/email/server.py --transport http --port 8801
uv run python mcp-servers/linkedin/server.py --transport http --port 8802# Interactive mode (requires approval for each action)
uv run python -m Orchestrator.main process
# Custom prompt
uv run python -m Orchestrator.main process --prompt "Review all pending approvals"
# Autonomous mode (YOLO - auto-approves all actions)
uv run python -m Orchestrator.main process --yolo
# Ralph Wiggum loop (autonomous multi-step processing)
uv run python -m Orchestrator.main ralph "Process all files in /Needs_Action"
# Execute all approved actions (emails, LinkedIn posts)
uv run python -m Orchestrator.main process-approvals
uv run python -m Orchestrator.main status
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DIGITAL FTE - SILVER TIER β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β PERCEPTION (Watchers) β REASONING (Qwen) β ACTION (MCP) β
β β
β ββββββββββββββββ βββββββββββββββ ββββββββββββββββ β
β β Gmail Watcherβ β β β Email MCP β β
β β WhatsApp βββββΆβ Qwen Code βββββΆβ LinkedIn MCP β β
β β File Watcher β β (Brain) β β (FastMCP) β β
β ββββββββββββββββ βββββββββββββββ ββββββββββββββββ β
β β β β β
β βΌ βΌ βΌ β
β ββββββββββββββββ βββββββββββββββ ββββββββββββββββ β
β β /Needs_Actionβ β Plan.md β β Human-in- β β
β β /Inbox β β Dashboard.mdβ β the-Loop β β
β ββββββββββββββββ βββββββββββββββ ββββββββββββββββ β
β β
β Obsidian Vault (Memory/GUI) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Watcher detects input (new email, WhatsApp message, file drop)
- Creates action file in
/Needs_Action/folder - Orchestrator triggers Qwen Code to process
- Qwen reads Company_Handbook.md for rules
- Qwen creates plan in
/Plans/folder - Qwen requests approval for sensitive actions (email, LinkedIn)
- Human reviews and moves files to
/Approved/ - MCP server executes action (send email, post LinkedIn)
- Files moved to
/Done/and Dashboard updated
Built with FastMCP, provides:
send_email- Send emails via Gmaildraft_email- Create draft emailssearch_emails- Search Gmailget_email_content- Get full email contentmark_as_read- Mark emails as read
Start:
uv run python mcp-servers/email/server.pyBuilt with FastMCP + Playwright, provides:
create_post- Publish LinkedIn postscreate_draft_post- Create draft for approvalget_profile_info- Get profile informationclose_session- Close browser session
Start:
uv run python mcp-servers/linkedin/server.pyFor sensitive actions, Qwen creates approval requests:
---
type: approval_request
action: email_send
to: client@example.com
subject: Invoice #123
created: 2026-01-07T10:30:00Z
status: pending
---
## Email Details
- **To:** client@example.com
- **Subject:** Invoice #123
- **Body:** Please find attached...
## To Approve
Move this file to /Approved folder.
## To Reject
Move this file to /Rejected folder.Approval Flow:
- File created in
/Pending_Approval/ - Human reviews content
- Move to
/Approved/to execute (or/Rejected/to cancel) - Orchestrator detects and calls MCP server
- Action executed, file moved to
/Done/
One-line approval: Move the approval request file from /Pending_Approval/ to /Approved/ folder.
- Obsidian vault with proper folder structure
- Dashboard.md tracking key metrics
- Company Handbook defining rules
- Multiple watchers operational (Gmail + WhatsApp + Filesystem)
- Qwen Code successfully processing files
- MCP servers built with FastMCP (Email + LinkedIn)
- Human-in-the-loop workflow complete
- Approval execution via MCP servers
- Agent Skills documented
- Odoo Accounting Integration - Self-hosted ERP via MCP
- Facebook/Instagram Integration - Social media posting
- Twitter (X) Integration - Tweet automation
- Weekly CEO Briefing - Autonomous business audit
- Error Recovery - Graceful degradation
- Comprehensive Audit Logging - Full action history
- Secrets never sync:
.env, tokens, credentials stay local - Dry run mode: Test without real actions
- Approval workflow: Sensitive actions require human approval
- Audit logging: All actions logged to
/Logs/ - Credential management: Use OS keychain for passwords
npm install -g @anthropic/qwen-code
# Verify installation
qwen --versionProblem: Qwen asks for approval before executing tools (write_file, run_shell_command, etc.)
Solution 1 - Use YOLO mode (full autonomy):
uv run python -m Orchestrator.main process --yolo
Solution 2 - Run interactively:
# Qwen will wait for your approval in the terminal
uv run python -m Orchestrator.main process - Ensure credentials.json is in
~/.gmail_watcher/ - First run will auto-authenticate and create token.json
- Check Google Cloud Console has Gmail API enabled
- Check if QR code was scanned on WhatsApp Web
- Verify
WHATSAPP_SESSION_PATHexists - Set
PLAYWRIGHT_HEADLESS=falseto debug visually
- Check server is running:
uv run python mcp-servers/email/server.py - Verify port is not in use
- Check firewall settings
- For Qwen Code integration, use stdio transport (default)
- Ensure filesystem watcher is running
- Check file isn't already processed (hash is tracked)
- Verify DRY_RUN=false in .env for actual processing
- doc.md - Full architectural blueprint
- vault/Company_Handbook.md - Rules of engagement
- vault/Business_Goals.md - Objectives and metrics
- vault/Dashboard.md - Real-time status
This is a hackathon project. Feel free to:
- Fork and extend functionality
- Add new watchers
- Implement additional MCP servers
- Improve documentation
MIT License - See LICENSE file for details
Built with β€οΈ for the Digital FTE Hackathon 2026
Version: 0.2 (Silver Tier) | Last Updated: 2026-03-20