Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 25 additions & 4 deletions app/models/calendar-events.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ const CalendarEvents = new mongoose.Schema(
required: true,
index: true
},

// Component type to differentiate between events and tasks
componentType: {
type: String,
enum: ['VEVENT', 'VTODO'],
index: true
},
/*
sequence: String,
transparency: {
Expand Down Expand Up @@ -105,7 +112,9 @@ const CalendarEvents = new mongoose.Schema(
recurrences: mongoose.Schema.Types.Mixed,
status: {
type: String,
enum: [null, 'TENTATIVE', 'CONFIRMED', 'CANCELLED']
// VEVENT: TENTATIVE, CONFIRMED, CANCELLED
// VTODO: NEEDS-ACTION, IN-PROCESS, COMPLETED, CANCELLED
enum: [null, 'TENTATIVE', 'CONFIRMED', 'CANCELLED', 'NEEDS-ACTION', 'IN-PROCESS', 'COMPLETED']
},

//
Expand All @@ -127,6 +136,7 @@ const CalendarEvents = new mongoose.Schema(
// '770bc7b3-d4ec-4306-bbb0-a773e8206487': { type: 'VEVENT', params: [], end: 2024-01-27T20:43:19.700Z },
// vcalendar: { type: 'VCALENDAR' }
// }
// Also supports VTODO components for task management
if (!isSANB(ics)) return false;

// safeguard in case library isn't working for some reason
Expand All @@ -141,9 +151,20 @@ const CalendarEvents = new mongoose.Schema(
if (!comp) throw new TypeError('ICAL.Component was not successful');

const vevent = comp.getFirstSubcomponent('vevent');

if (!vevent)
throw new TypeError('comp.getFirstSubcomponent was not successful');
const vtodo = comp.getFirstSubcomponent('vtodo');

if (!vevent && !vtodo)
throw new TypeError('No valid VEVENT or VTODO component found');

// Auto-detect and set component type
if (vevent && !vtodo) {
this.componentType = 'VEVENT';
} else if (vtodo && !vevent) {
this.componentType = 'VTODO';
} else if (vevent && vtodo) {
// If both exist, prioritize VEVENT for backward compatibility
this.componentType = 'VEVENT';
}

return true;
}
Expand Down
8 changes: 8 additions & 0 deletions app/models/calendars.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,14 @@ const Calendars = new mongoose.Schema(
required: true,
lowercase: true,
validate: (v) => isURL(v, { require_tld: false }) // require_tld: config.env === 'production'
},

// Supported calendar component types
supportedComponents: {
type: [String],
enum: ['VEVENT', 'VTODO'],
default: ['VEVENT'], // Default to events only for backward compatibility
index: true
}
},
dummySchemaOptions
Expand Down
142 changes: 142 additions & 0 deletions app/views/faq/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@
* [How do I connect and configure my contacts](#how-do-i-connect-and-configure-my-contacts)
* [How do I connect and configure my calendars](#how-do-i-connect-and-configure-my-calendars)
* [How do I add more calendars and manage existing calendars](#how-do-i-add-more-calendars-and-manage-existing-calendars)
* [How do I connect and configure tasks and reminders](#how-do-i-connect-and-configure-tasks-and-reminders)
* [Why can't I create tasks in macOS Reminders](#why-cant-i-create-tasks-in-macos-reminders)
* [How do I set up Tasks.org on Android](#how-do-i-set-up-tasksorg-on-android)
* [How do I set up SRS for Forward Email](#how-do-i-set-up-srs-for-forward-email)
* [How do I set up MTA-STS for Forward Email](#how-do-i-set-up-mta-sts-for-forward-email)
* [How do I add a profile picture to my email address](#how-do-i-add-a-profile-picture-to-my-email-address)
Expand All @@ -51,6 +54,7 @@
* [Do you support receiving email with IMAP](#do-you-support-receiving-email-with-imap)
* [Do you support POP3](#do-you-support-pop3)
* [Do you support calendars (CalDAV)](#do-you-support-calendars-caldav)
* [Do you support tasks and reminders (CalDAV VTODO)](#do-you-support-tasks-and-reminders-caldav-vtodo)
* [Do you support contacts (CardDAV)](#do-you-support-contacts-carddav)
* [Do you support sending email with SMTP](#do-you-support-sending-email-with-smtp)
* [Do you support OpenPGP/MIME, end-to-end encryption ("E2EE"), and Web Key Directory ("WKD")](#do-you-support-openpgpmime-end-to-end-encryption-e2ee-and-web-key-directory-wkd)
Expand Down Expand Up @@ -1529,6 +1533,108 @@ If you'd like to add additional calendars, then just add a new calendar URL of:

You can change a calendar's name and color after creation – just use your preferred calendar application (e.g. Apple Mail or [Thunderbird](https://thunderbird.net)).

### How do I connect and configure tasks and reminders

**To configure tasks and reminders, use the same CalDAV URL as calendars:** `https://caldav.forwardemail.net` (or simply `caldav.forwardemail.net` if your client allows it)

Tasks and reminders will automatically be separated from calendar events into their own "Reminders" or "Tasks" calendar collection.

**Setup instructions by platform:**

**macOS/iOS:**

1. Add a new CalDAV account in System Preferences > Internet Accounts (or Settings > Accounts on iOS)
2. Use `caldav.forwardemail.net` as the server
3. Enter your Forward Email alias and generated password
4. After setup, you'll see both "Calendar" and "Reminders" collections
5. Use the Reminders app to create and manage tasks

**Android with Tasks.org:**

1. Install Tasks.org from Google Play Store or F-Droid
2. Go to Settings > Synchronization > Add Account > CalDAV
3. Enter server: `https://caldav.forwardemail.net`
4. Enter your Forward Email alias and generated password
5. Tasks.org will automatically discover your task calendars

**Thunderbird:**

1. Install the Lightning add-on if not already installed
2. Create a new calendar with type "CalDAV"
3. Use URL: `https://caldav.forwardemail.net`
4. Enter your Forward Email credentials
5. Both events and tasks will be available in the calendar interface

### Why can't I create tasks in macOS Reminders

If you're having trouble creating tasks in macOS Reminders, try these troubleshooting steps:

1. **Check account setup**: Ensure your CalDAV account is properly configured with `caldav.forwardemail.net`

2. **Verify separate calendars**: You should see both "Calendar" and "Reminders" in your account. If you only see "Calendar", the task support may not be fully activated yet.

3. **Refresh account**: Try removing and re-adding your CalDAV account in System Preferences > Internet Accounts

4. **Check server connectivity**: Test that you can access `https://caldav.forwardemail.net` in your browser

5. **Verify credentials**: Ensure you're using the correct alias email and generated password (not your account password)

6. **Force sync**: In Reminders app, try creating a task and then manually refreshing the sync

**Common issues:**

* **"Reminders calendar not found"**: The server may need a moment to create the Reminders collection on first access
* **Tasks not syncing**: Check that both devices are using the same CalDAV account credentials
* **Mixed content**: Ensure tasks are being created in the "Reminders" calendar, not the general "Calendar"

### How do I set up Tasks.org on Android

Tasks.org is a popular open-source task manager that works excellently with Forward Email's CalDAV task support.

**Installation and Setup:**

1. **Install Tasks.org**:
* From Google Play Store: [Tasks.org](https://play.google.com/store/apps/details?id=org.tasks)
* From F-Droid: [Tasks.org on F-Droid](https://f-droid.org/packages/org.tasks/)

2. **Configure CalDAV sync**:
* Open Tasks.org
* Go to ☰ Menu > Settings > Synchronization
* Tap "Add Account"
* Select "CalDAV"

3. **Enter Forward Email settings**:
* **Server URL**: `https://caldav.forwardemail.net`
* **Username**: Your Forward Email alias (e.g., `[email protected]`)
* **Password**: Your alias-specific generated password
* Tap "Add Account"

4. **Account discovery**:
* Tasks.org will automatically discover your task calendars
* You should see your "Reminders" collection appear
* Tap "Subscribe" to enable sync for the task calendar

5. **Test sync**:
* Create a test task in Tasks.org
* Check that it appears in other CalDAV clients (like macOS Reminders)
* Verify changes sync both ways

**Features available:**

* ✅ Task creation and editing
* ✅ Due dates and reminders
* ✅ Task completion and status
* ✅ Priority levels
* ✅ Subtasks and task hierarchy
* ✅ Tags and categories
* ✅ Two-way sync with other CalDAV clients

**Troubleshooting:**

* If no task calendars appear, try manually refreshing in Tasks.org settings
* Ensure you have at least one task created on the server (you can create one in macOS Reminders first)
* Check network connectivity to `caldav.forwardemail.net`

### How do I set up SRS for Forward Email

We automatically configure [Sender Rewriting Scheme](https://en.wikipedia.org/wiki/Sender_Rewriting_Scheme) ("SRS") – you do not need to do this yourself.
Expand Down Expand Up @@ -1712,6 +1818,42 @@ It supports both IPv4 and IPv6 and is available over port `443` (HTTPS).

In order to use calendar support, the **user** must be the email address of an alias that exists for the domain at <a href="/my-account/domains" target="_blank" rel="noopener noreferrer">My Account <i class="fa fa-angle-right"></i> Domains</a> – and the **password** must be an alias-specific generated password.

### Do you support tasks and reminders (CalDAV VTODO)

Yes, as of \[INSERT DATE] we have added CalDAV VTODO support for tasks and reminders. This uses the same server as our calendar support: `caldav.forwardemail.net`.

Our CalDAV server supports both calendar events (VEVENT) and tasks (VTODO) components, with automatic separation into appropriate calendar collections:

* **Calendar events** go into your main "Calendar" collection
* **Tasks/reminders** go into a separate "Reminders" collection

**Supported task clients:**

* **macOS Reminders** - Full native support for task creation, editing, completion, and sync
* **iOS Reminders** - Full native support across all iOS devices
* **Tasks.org (Android)** - Popular open-source task manager with CalDAV sync
* **Thunderbird with Lightning** - Task support in desktop email client
* **Any CalDAV-compatible task manager** - Standard VTODO component support

**Task features supported:**

* Task creation, editing, and deletion
* Due dates and start dates
* Task completion status (NEEDS-ACTION, IN-PROCESS, COMPLETED, CANCELLED)
* Task priority levels
* Recurring tasks
* Task descriptions and notes
* Multi-device synchronization

The login credentials are the same as for calendar support:

| Login | Example | Description |
| -------- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Username | `[email protected]` | Email address of an alias that exists for the domain at <a href="/my-account/domains" target="_blank" rel="noopener noreferrer">My Account <i class="fa fa-angle-right"></i> Domains</a>. |
| Password | `************************` | Alias-specific generated password. |

**Important:** Tasks and calendar events are kept in separate collections to ensure proper client compatibility, especially with Apple devices that expect dedicated task calendars.

### Do you support contacts (CardDAV)

Yes, as of June 12, 2025 we have added this feature. Our server is `carddav.forwardemail.net` and is also monitored on our <a href="https://status.forwardemail.net" target="_blank" rel="noopener noreferrer">status page</a>.
Expand Down
Loading
Loading