Tasks Complete
0
of 0 total tasks
Overall Progress
0%
Est. completion tracking
Behind Schedule
0
tasks past due date
Hours Logged
0h
of ~130h estimated
Phase Progress
All 9 phases
Recent Activity
Latest updates
Full Roadmap
Click any phase to expand tasks
March 2026
Scheduled tasks and deadlines
Upcoming this week
Alerts & Notifications
Tasks needing attention
Google Sheets Backup
Auto-syncs roadmap data on every update
Setup: Google Sheets Integration
1
Create a new Google Sheet
Go to sheets.google.com and create a new spreadsheet named "Bourbon App Roadmap". Create two tabs: Roadmap and Activity Log.
2
Open Apps Script editor
In your Sheet, go to Extensions → Apps Script. Delete any existing code and paste the script below:
// Bourbon App Roadmap Sync Script
```
// Paste this entire block into Apps Script
function doPost(e) {
try {
var data = JSON.parse(e.postData.contents);
var ss = SpreadsheetApp.getActiveSpreadsheet();
```
if (data.type === 'roadmap') {
var sheet = ss.getSheetByName('Roadmap') || ss.insertSheet('Roadmap');
sheet.clearContents();
var headers = ['Phase','Block ID','Task Name','Status','Due Date','Duration','Hours','Notes','Last Updated'];
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
sheet.getRange(1, 1, 1, headers.length)
.setBackground('#C8871A').setFontColor('#1C1A18').setFontWeight('bold');
if (data.tasks && data.tasks.length > 0) {
var rows = data.tasks.map(function(t) {
return [t.phase||'', t.id||'', t.name||'', t.status||'todo',
t.dueDate||'', t.duration||'', t.hours||0, t.notes||'',
new Date().toISOString()];
});
sheet.getRange(2, 1, rows.length, headers.length).setValues(rows);
}
}
if (data.type === 'activity') {
var log = ss.getSheetByName('Activity Log') || ss.insertSheet('Activity Log');
if (log.getLastRow() === 0) {
log.getRange(1,1,1,4).setValues([['Timestamp','Task ID','Action','Notes']]);
log.getRange(1,1,1,4).setBackground('#C8871A').setFontColor('#1C1A18').setFontWeight('bold');
}
log.appendRow([new Date().toISOString(), data.taskId, data.action, data.notes||'']);
}
return ContentService.createTextOutput(JSON.stringify({success:true}))
.setMimeType(ContentService.MimeType.JSON);
```
} catch(err) {
return ContentService.createTextOutput(JSON.stringify({success:false,error:err.message}))
.setMimeType(ContentService.MimeType.JSON);
}
}
3
Deploy as Web App
Click Deploy → New Deployment. Type: Web App. Execute as: Me. Who has access: Anyone. Click Deploy and copy the URL.
4
Enter your Apps Script URL
Paste your deployment URL below and click Save. The dashboard will sync automatically on every task update.
Sync Log
No sync events yet.
Cloudflare Access Security
Protect this dashboard with your Cloudflare account
⚡ How this works: Cloudflare Access acts as an identity-aware proxy in front of your dashboard. Anyone visiting the URL is redirected to a Cloudflare login page. Only email addresses you approve can access the site — no passwords to manage, no backend auth code. Works with Google, GitHub, or one-time email PINs.
Step-by-Step: Hosting + Cloudflare Access
1
Host the dashboard file
Upload
index.html to one of these options (choose one):Option A — Cloudflare Pages (recommended, free):
```
1. Go to dash.cloudflare.com → Workers & Pages → Pages
1. Click “Create a project” → “Direct Upload”
1. Upload your index.html file
1. Your site gets URL: https://bourbon-dashboard.pages.dev
1. Add custom domain if desired (e.g., dev.yourapp.com)
Option B — Any static host (Vercel, Netlify, GitHub Pages):
1. Upload index.html to your preferred host
1. Get the public URL
1. Then proceed to Cloudflare Access steps below
2
Enable Cloudflare Zero Trust (Access)
In your Cloudflare dashboard:
1. Go to dash.cloudflare.com
```
1. Click “Zero Trust” in the left sidebar
1. If first time: complete Zero Trust onboarding (free plan works)
1. Your team name will be: [yourname].cloudflareaccess.com
3
Create an Access Application
This is what protects your dashboard URL:
1. In Zero Trust → Access → Applications
```
1. Click “Add an Application”
1. Select “Self-hosted”
1. Application Name: “Bourbon App Dashboard”
1. Session Duration: 24 hours (or 7 days for convenience)
1. Application Domain: your-dashboard-url.pages.dev
(or your custom domain)
1. Click Next
4
Create an Access Policy
Who is allowed to access the dashboard:
1. Policy Name: "George Parker Only"
```
1. Action: Allow
1. Configure Rules:
- Rule: Emails → georgeparkerjr@[yourdomain].com
(Add any additional authorized emails here)
1. Click Save policy
5
Configure Identity Provider (Login Method)
Choose how you log in:
Option A — One-time PIN (easiest, no setup):
```
1. Zero Trust → Settings → Authentication
1. Enable “One-time PIN”
1. Users enter their email → receive a 6-digit code
1. That’s it! No Google/GitHub credentials needed.
Option B — Google (if you want Google account login):
1. Zero Trust → Settings → Authentication → Add new
1. Select Google
1. Create OAuth credentials at console.cloud.google.com
1. Add Client ID + Secret to Cloudflare
1. Authorize your Google account email in the policy
6
Test your secured dashboard
Visit your dashboard URL in an incognito window:
1. Open incognito/private browser window
```
1. Go to: https://your-dashboard-url.pages.dev
1. You should see the Cloudflare Access login page
1. Enter your email → receive PIN or Google login
1. After auth → redirected to your dashboard ✓
If it’s not redirecting: check that your Pages domain
matches exactly what you entered in the Access Application.
7
Save settings in dashboard
Enter your dashboard URL here so Google Sheets sync and settings reference the correct location:
Settings
Configure dashboard preferences
Project Info
Edit your project details
Notification Preferences
Behind Schedule Alerts
Alert when a task is past its due date
Weekly Progress Digest
Summary of tasks completed vs. planned
Auto-sync to Google Sheets
Sync data on every task status change
Data Management