speed of thought
Email at the speed of thought.
A blazing-fast, keyboard-first desktop email client built with Tauri, React, and Rust.
Local-first. Privacy-focused. AI-powered.
Features • Installation • Shortcuts • Architecture • Development • Contributing
---
Built with Rust and React.
Made by Avihay.
Velo is a fast and beautiful desktop email client, built with modern web technologies.
130+ features built for people who live in their inbox.
{feature.description}
{feature.description}
{item.description}
Julia proposes a partnership with Acme Corp for Q2. Key terms: 15% revenue share, 12-month commitment, joint marketing campaign. She's requesting a meeting next week to discuss details.
Hi Alex,
Following up on our conversation at the conference. I'd love to schedule a call to discuss the partnership terms in detail. Would Thursday or Friday work for you?
I've attached the proposed agreement for your review.
Best,
Julia
Hi Julia,
Thursday at 2pm works perfectly. I'll review the proposed agreement before our call so we can dive right into the details.
Would it be alright if I include our legal counsel? It would help streamline the process.
Alex shares the Q1 roadmap with 3 milestones: component library v2 (Feb 15), API redesign (Mar 1), and mobile beta (Mar 20). Suggests prioritizing API work.
{MESSAGE_BODY}
Sign in with your Google account to connect it to Velo.
{error && (Choose how you want to connect your email account.
Connect to iCloud, Fastmail, Nextcloud, or any CalDAV server
Testing connection...
> )} {!testing && testResult?.success && ( <>{testResult.message}
{calendarCount > 0 && (Found {calendarCount} calendar{calendarCount !== 1 ? "s" : ""}
)} > )} {!testing && testResult && !testResult.success && ( <>Connection failed
{testResult.message}
> )}CalDAV account added!
Your calendars will sync automatically.
You need to register an app with {providerName} to get a Client ID.{" "}
{providerId === "microsoft" && (
<>Register at the Azure Portal (App Registrations) with redirect URI http://127.0.0.1:17248.>
)}
{providerId === "yahoo" && (
<>Register at the Yahoo Developer Network with redirect URI http://127.0.0.1:17248.>
)}
Only needed if your login username differs from your email address.
If your provider requires it, use an app-specific password.
Server settings have been auto-configured for your provider. You can adjust them if needed.
)}Enable for local mail bridges like ProtonMail Bridge
Server settings have been auto-configured for your provider. You can adjust them if needed.
)}To connect Gmail accounts, you need a Google Cloud OAuth Client ID.
http://127.0.0.1:17248{" "}
as an authorized redirect URI
Required for Web application credentials
Loading attachments...
Calendar is not configured for this account.
For IMAP accounts, configure CalDAV in Settings.
Calendar access error
{calendarError}
Calendar requires re-authorization
Your account was connected before calendar permissions were added. Re-authorize to grant calendar access — your emails and data will not be affected.
{error && ({error}
)}{error}
)}Loading preview...
)} {error && ({error}
)} {!loading && !error && blobUrl && isImage(attachment.mime_type) && (Preview not available for this file type
{attachment.mime_type ?? "Unknown type"}
{text ?? "Loading..."}
);
}
export { getAttachmentsForMessage };
================================================
FILE: src/components/email/AuthBadge.test.tsx
================================================
import { describe, it, expect } from "vitest";
import { render, screen } from "@testing-library/react";
import { AuthBadge } from "./AuthBadge";
import type { AuthResult } from "@/services/gmail/authParser";
function makeAuthResults(aggregate: AuthResult["aggregate"]): string {
const result: AuthResult = {
spf: { result: aggregate === "pass" ? "pass" : "fail", detail: null },
dkim: { result: aggregate === "pass" ? "pass" : "fail", detail: null },
dmarc: { result: aggregate === "pass" ? "pass" : "fail", detail: null },
aggregate,
};
return JSON.stringify(result);
}
describe("AuthBadge", () => {
it("should render ShieldCheck for pass aggregate", () => {
const { container } = render(
Authentication failed
This message from {sender} failed email authentication checks (SPF/DKIM/DMARC). Be cautious with any links or attachments.