Google Calendar Privacy Proxy
https://github.com/infiniteloopltd/Google-Calendar-Redactor-Proxy/
A lightweight Google Cloud Run service that creates privacy-protected calendar feeds from Google Calendar. Share your availability with colleagues without exposing personal appointment details.
The Problem
You want to share your calendar availability with work colleagues, but:
- You have multiple calendars (work, personal, family) that you need to consolidate
- Google Calendar’s subscribed calendars (ICS feeds) don’t count toward your Outlook free/busy status
- You don’t want to expose personal appointment details to work contacts
- Outlook’s native calendar sharing only works with Exchange/Microsoft 365 calendars, not external ICS subscriptions
This service solves that problem by creating a privacy-filtered calendar feed that Outlook can subscribe to, showing you as “Busy” during your appointments without revealing what those appointments are.
How It Works
Google Calendar → This Service → Privacy-Protected ICS Feed → Outlook
(full details) (redaction) (busy blocks only) (subscription)
The service:
- Fetches your Google Calendar ICS feed using the private URL
- Strips out all identifying information (titles, descriptions, locations, attendees)
- Replaces event summaries with “Busy”
- Preserves all timing information (when you’re busy/free)
- Returns a sanitized ICS feed that Outlook can subscribe to
Use Cases
- Multiple calendar consolidation: Combine work, personal, and family calendars into one availability view
- Privacy-protected sharing: Share when you’re busy without sharing what you’re doing
- Cross-platform calendaring: Bridge Google Calendar into Outlook environments
- Professional boundaries: Keep personal life private while showing accurate availability
Quick Start
1. Get Your Google Calendar Private URL
- Open Google Calendar
- Click the ⚙️ Settings icon → Settings
- Select your calendar from the left sidebar
- Scroll to “Integrate calendar”
- Copy the “Secret address in iCal format” URL
Your URL will look like:
https://calendar.google.com/calendar/ical/info%40infiniteloop.ie/private-xxxxxxx/basic.ics
2. Deploy the Service
# Edit deploy.bat and set your PROJECT_ID deploy.bat # Or deploy manually gcloud run deploy calendar-proxy --source . --platform managed --region europe-west1 --allow-unauthenticated
You’ll get a service URL like: https://calendar-proxy-xxxxxxxxxx-ew.a.run.app
3. Construct Your Privacy-Protected Feed URL
From your Google Calendar URL:
https://calendar.google.com/calendar/ical/info%xxxxx.xxx/private-xxxxxxx/basic.ics
Extract:
- calendarId:
info@infiniteloop.ie(URL decoded) - privateKey:
xxxxxxxxxx(just the key, without “private-” prefix)
Build your proxy URL:
https://calendar-proxy-xxxxxxxxxx-ew.a.run.app/calendar?calendarId=info@infiniteloop.ie&privateKey=xxxxxxx
4. Subscribe in Outlook
Outlook Desktop / Web
- Open Outlook
- Go to Calendar
- Click Add Calendar → Subscribe from web
- Paste your proxy URL
- Give it a name (e.g., “My Availability”)
- Click Import
Outlook will now show:
- ✅ Blocked time during your appointments
- ✅ “Busy” status for those times
- ❌ No details about what the appointments are
What Gets Redacted
The service removes all identifying information:
| Original ICS Property | Result |
|---|---|
SUMMARY: (event title) | → "Busy" |
DESCRIPTION: (event details) | → Removed |
LOCATION: (where) | → Removed |
ORGANIZER: (who created it) | → Removed |
ATTENDEE: (participants) | → Removed |
URL: (meeting links) | → Removed |
ATTACH: (attachments) | → Removed |
CLASS: (privacy) | → Set to PRIVATE |
What Gets Preserved
All timing and scheduling information remains intact:
- ✅ Event start times (
DTSTART) - ✅ Event end times (
DTEND) - ✅ Event duration
- ✅ Recurring events (
RRULE) - ✅ Exception dates (
EXDATE) - ✅ Event status (confirmed, tentative, cancelled)
- ✅ Time zones
- ✅ All-day events
- ✅ Unique identifiers (
UID)
Technical Details
Stack: .NET 8 / ASP.NET Core Minimal API
Hosting: Google Cloud Run (serverless)
Cost: Virtually free for personal use (Cloud Run free tier: 2M requests/month)
Latency: ~200-500ms per request (fetches from Google, processes, returns)
API Endpoint
GET /calendar?calendarId={id}&privateKey={key}
Parameters:
calendarId(required): Your Google Calendar ID (usually your email)privateKey(required): The private key from your Google Calendar ICS URL
Response:
- Content-Type:
text/calendar; charset=utf-8 - Body: Privacy-redacted ICS feed
Local Development
# Run locally dotnet run # Test curl "http://localhost:8080/calendar?calendarId=test@example.com&privateKey=abc123"
Deployment
Prerequisites
- Google Cloud SDK installed
- .NET 8 SDK installed
- GCP project with Cloud Run API enabled
- Billing enabled on your GCP project
Deploy
# Option 1: Use the batch file deploy.bat # Option 2: Manual deployment gcloud run deploy calendar-proxy ^ --source . ^ --platform managed ^ --region europe-west1 ^ --allow-unauthenticated ^ --memory 512Mi
The --allow-unauthenticated flag is required so that Outlook can fetch your calendar without authentication. Your calendar data is still protected by the private key in the URL.
Security & Privacy
Is This Secure?
Yes, with caveats:
✅ Your calendar data is already protected by Google’s private key mechanism
✅ No data is stored – the service is stateless and doesn’t log calendar contents
✅ HTTPS encrypted – All traffic is encrypted in transit
✅ Minimal attack surface – Simple pass-through service with redaction
⚠️ Considerations:
- Your private key is in the URL you share (same as Google’s original ICS URL)
- Anyone with your proxy URL can see your busy/free times (but not details)
- The service runs as
--allow-unauthenticatedso Outlook can fetch it - If you need stricter access control, consider adding authentication
Privacy Features
- Strips all personally identifying information
- Marks all events as
CLASS:PRIVATE - No logging of calendar contents
- No data persistence
- Stateless operation
Recommendations
- Don’t share your proxy URL publicly
- Treat it like a password – it grants access to your availability
- Regenerate your Google Calendar private key if compromised
- Monitor your Cloud Run logs for unexpected access patterns
Cost Estimation
Google Cloud Run pricing (as of 2025):
- Free tier: 2M requests/month, 360,000 GB-seconds/month
- Typical calendar: Refreshes every 30-60 minutes
- Monthly cost: $0 for personal use (well within free tier)
Even with 10 people subscribing to your calendar refreshing every 30 minutes:
- ~14,400 requests/month
- ~$0.00 cost
Troubleshooting
“404 Not Found” when subscribing in Outlook
- Verify your service is deployed:
gcloud run services list - Check your URL is correctly formatted
- Ensure
--allow-unauthenticatedis set
“Invalid calendar” error
- Verify your Google Calendar private key is correct
- Test the URL directly in a browser first
- Check that your calendarId doesn’t have URL encoding issues
Events not showing up
- Google Calendar ICS feeds can take 12-24 hours to reflect changes
- Try re-subscribing to the calendar in Outlook
- Verify the original Google Calendar ICS URL works
Deployment fails
# Ensure you're authenticated gcloud auth login # Set your project gcloud config set project YOUR_PROJECT_ID # Enable required APIs gcloud services enable run.googleapis.com gcloud services enable cloudbuild.googleapis.com
Limitations
- Refresh rate: Calendar clients typically refresh ICS feeds every 30-60 minutes (not real-time)
- Google’s ICS feed: Updates can take up to 24 hours to reflect in the ICS feed
- Authentication: No built-in authentication (relies on URL secrecy)
- Multi-calendar: Requires one proxy URL per Google Calendar
Alternatives Considered
| Solution | Pros | Cons |
|---|---|---|
| Native Outlook calendar sharing | Built-in, real-time | Only works with Exchange calendars |
| Calendly/Bookings | Professional, feature-rich | Monthly cost, overkill for simple availability |
| Manual sync (Zapier/Power Automate) | Works | Complex setup, ongoing maintenance |
| This solution | Simple, free, privacy-focused | Relies on ICS feed delays |
Contributing
Contributions welcome! Areas for enhancement:
- Add basic authentication support
- Support multiple calendars in one feed
- Caching layer to reduce Google Calendar API calls
- Health check endpoint
- Metrics/monitoring
- Custom “Busy” text per calendar
License
MIT License – free to use, modify, and distribute.
Author
Created by Infinite Loop Development Ltd to solve a real business need for calendar privacy across platforms. https://github.com/infiniteloopltd/Google-Calendar-Redactor-Proxy/