- Upload EPUB, PDF, TXT, MD, and DOCX files, then listen with your
- preferred OpenAI-compatible TTS provider. Your reading progress
- syncs across devices automatically.
-
-
-
- Open App
-
-
- Sign In
- {enableUserSignups && Sign Up}
- Docs
-
-
-
- {/* ── FEATURES ───────────────── */}
-
-
-
↑
-
Upload documents
-
- Drag and drop EPUB, PDF, TXT, Markdown, or DOCX files directly
- into the app. Documents process instantly for reading and
- text-to-speech playback.
-
-
-
-
¶
-
Your library
-
- Build a personal library with folders. Documents sync
- automatically so your collection is always within
- reach.
-
-
-
-
↔
-
Cross-device sync
-
- Reading progress, preferences, and library state sync across
- devices. Pick up exactly where you left off on any browser.
-
-
-
-
- {/* ── TTS SPOTLIGHT ──────────── */}
-
-
-
-
- Text-to-speech that follows along as you read
-
-
- OpenReader highlights every word as it’s spoken, turning
- any document into a synchronized read-along experience. Connect
- any OpenAI-compatible TTS provider — including Kokoro,
- KittenTTS, Deepinfra, or your own self-hosted endpoint.
+
+
+
+
+
{instanceBadge}
+
+ Turn static files into a living read-along surface.
+
+
+ OpenReader is a self-host-friendly workspace for EPUB, PDF, TXT, MD, and DOCX. It combines
+ synchronized speech, fast navigation, and cloud or local TTS providers so long-form reading is easier
+ to sustain.
Each word lights up in sync with the audio so you never lose your place.
-
-
-
- •
-
-
Multiple voices & providers
-
Choose from dozens of voices across OpenAI, Kokoro, KittenTTS, Deepinfra, or any compatible endpoint.
-
-
-
- •
-
-
Speed controls
-
Independent model speed and playback speed sliders from 0.5x to 3x.
-
-
-
- •
-
-
Audiobook export
-
Convert any document to a downloadable MP3 or M4A audiobook with chapter metadata.
-
-
-
-
-
+
+
+ Parsing
+
Structured document understanding
+
Geometry-aware parsing gives stable reading order and cleaner highlighting, especially for complex PDF layouts.
+
+
+ Alignment
+
ONNX-powered timing maps
+
Speech alignment data links each spoken unit back to text so the cursor follows naturally during playback.
+
+
+ Providers
+
Cloud + self-hosted voices
+
Use OpenAI, DeepInfra, Replicate, or OpenAI-compatible local servers such as Kokoro or KittenTTS.
+
+
+ Distribution
+
Audiobook-ready output
+
Export chapterized audio and keep metadata clean for downstream players, with resumable processing for large docs.
+
+
+
- {/* ── FORMATS ────────────────── */}
-
-
Supported formats
-
- EPUB
- PDF
- TXT
- MD
- DOCX
-
-
+
+
+
Typical workflow
+
Minimal friction from upload to listen.
+
+
+
+
Drop a file
+
Import a document into your library and keep it organized for repeat sessions.
+
+
+
Choose a voice stack
+
Pick provider, model, and speed profile tuned to your reading pace.
+
+
+
Read, listen, export
+
Track progress with synchronized highlighting and export audiobook files when you need offline playback.
+
+
+
- {/* ── CTA ────────────────────── */}
-
-
-
-
Start reading now
+
+
Ship your own private reading stack.
- Open the app and upload a document to begin.
- Your progress syncs across devices automatically.
+ Run OpenReader locally or deploy it for your team. The docs cover Docker setup, provider integration,
+ object storage, and compute worker configuration.
-
- Open App
- Sign In
- {enableUserSignups && Sign Up}
- Docs
+
+
);
}
diff --git a/src/app/(public)/privacy/page.tsx b/src/app/(public)/privacy/page.tsx
index addefc5..aa47b64 100644
--- a/src/app/(public)/privacy/page.tsx
+++ b/src/app/(public)/privacy/page.tsx
@@ -1,11 +1,12 @@
import type { Metadata } from 'next';
import Link from 'next/link';
import { headers } from 'next/headers';
+import { buttonClass } from '@/components/ui/buttonPrimitives';
export const metadata: Metadata = {
- title: 'Privacy & Data Usage | OpenReader',
+ title: 'Privacy & Data Usage',
description:
- 'Learn how OpenReader handles your data, what is stored in your browser, and what is sent to the server.',
+ 'How OpenReader collects, stores, and processes data, including usage analytics controls and your account rights.',
alternates: {
canonical: '/privacy',
},
@@ -17,8 +18,7 @@ export const metadata: Metadata = {
export default async function PrivacyPage() {
const effectiveDate = 'February 17, 2026';
- const isRichardrDevProductionInstance =
- process.env.RICHARDRDEV_PRODUCTION === 'true';
+ const isRichardrDevProductionInstance = process.env.RICHARDRDEV_PRODUCTION === 'true';
const hdrs = await headers();
const host = hdrs.get('host') ?? 'this server';
@@ -26,308 +26,163 @@ export default async function PrivacyPage() {
const origin = `${proto}://${host}`;
return (
- <>
-
-
-
-
Privacy & Data Usage
-
- Effective Date: {effectiveDate}
-
-
-
- This OpenReader instance is hosted at {origin}.
- The operator of this service is responsible for handling your information.
-
-
- {isRichardrDevProductionInstance ? (
-
- US-only availability: This instance is intended for
- users located in the United States. Requests from outside the US,
- or requests without reliable country metadata, may be blocked.
+
+
+
+
Privacy, data flow, and account controls.
+
+ This policy explains what data OpenReader processes, how it is used, and the controls available to you.
+ It applies to the instance currently running at {origin}. Effective date: {effectiveDate}.
+
+
+ No personal data sales
+ Analytics consent controls
+ Account export + deletion tools
+ Encrypted document storage
- ) : null}
-
-
- OpenReader does not sell your personal information. We do not sell data to data brokers or third parties.
- We use data solely to provide and improve the reading experience.
-
-
-
-
-
-
- 1. Information We Collect (CCPA Categories)
-
-
- We collect information that identifies, relates to, describes, references, or is reasonably capable of being associated with you ("Personal Information").
-
-
-
Categories Collected
-
-
- Identifiers: Email address, IP address, unique personal identifier (session token), and account name.
-
Source: Directly from you. Purpose: Authentication, security, providing service.
+ US-only availability: this official instance is intended for users located in the United States,
+ and requests outside the US may be blocked.
-
+ ) : null}
+
-
-
-
- 2. How We Use Your Information
-
-
-
To provide, support, and personalize the OpenReader application.
-
To process your uploaded documents for display and text-to-speech conversion.
-
To maintain the safety, security, and integrity of our service.
-
To debug and repair errors that impair existing intended functionality.
+
+
-
-
-
- 3. Sharing & Selling
-
-
- We do not sell your personal information.
-
-
- We may "share" (as defined by CPRA for cross-context behavioral advertising) anonymous usage data with analytics providers solely to improve our app. You can opt-out of this sharing via the Cookie Banner, and Global Privacy Control (GPC) signals are automatically honored.
-
-
-
Service Providers (Sub-processors)
+
+
+
1. Information we collect
+
+ OpenReader collects data needed to operate the service and maintain your reading state.
+ Categories include account identifiers, uploaded content, and product usage telemetry.
+
+
+
Identifiers: Email, session-related identifiers, account name, and IP metadata for authentication and security.
+
Reader content: Uploaded documents, reading progress, bookmarks, and playback settings required for core functionality.
+
Usage events: Feature interactions and performance analytics used to debug and improve product reliability.
+
+
+
+
+
2. How we use your data
+
+
Deliver and personalize document reading and text-to-speech playback.
+
Process uploaded files for parsing, synchronization, and optional audiobook export.
+
Keep the platform secure and prevent abuse.
+
Diagnose issues and improve performance of existing functionality.
+
+
+
+
+
3. Sharing and service providers
+
+ OpenReader does not sell personal information. Limited processing may be delegated to infrastructure
+ or model providers as required to run the service.
+
+
+ {isRichardrDevProductionInstance ? (
+ <>
+
Hosting: Vercel for application hosting, edge runtime, and performance analytics.
+
Database: Neon PostgreSQL for account and document metadata storage.
+
File storage: Railway S3-compatible object storage for encrypted uploaded documents and audio artifacts.
+
TTS processing: DeepInfra or configured OpenAI-compatible providers, only when initiated by user actions.
+ >
+ ) : (
+ <>
+
Hosting provider: The deployment host operating this OpenReader instance.
+
Database + storage: Configured SQL and object storage services chosen by the instance operator.
+
TTS provider: The configured cloud or self-hosted speech provider for generated audio.
+ >
+ )}
+
+
+
+
+
4. Your privacy rights
+
+ Depending on your jurisdiction, rights may include access, correction, deletion, and opt-out controls.
+ OpenReader includes in-product controls for exporting and deleting account data.
+
+
+
Right to know: request details about data categories and usage.
+
Right to delete: delete your account and associated records in Settings.
+
Right to correct: update account data where applicable.
+
Right to opt out: disable non-essential analytics through consent controls.
+
Right to non-discrimination: exercising privacy rights does not reduce service access.
+
+
+ In-app controls: Use Export My Data in Settings to download account metadata plus
+ object-storage-backed files, or use Delete Account for permanent account removal.
+
+
+
+
+
5. Retention and security
+
+ Account data and uploaded files are retained while your account remains active. Documents are stored
+ encrypted at rest. When account deletion completes, active database and storage records are removed.
+
+ For the official instance, processing and storage occur in the United States. By using this service,
+ you acknowledge that data is handled in the US and that availability may be limited to US users.
+
TTS Provider: Text-to-Speech Processing (Based on your configured provider)
-
+
+ Data processing location depends on the deployment environment and provider configuration selected by
+ the instance operator.
+
)}
-
-
+
-
-
-
- 4. Your Rights (CCPA/CPRA)
-
-
- You have the following rights regarding your personal information:
-
-
-
-
Right to Know: You may request details about the categories and specific pieces of personal information we have collected.
-
Right to Delete: You may request deletion of your personal information (via "Delete Account" in Settings).
-
Right to Correct: You may update your account information in Settings.
-
Right to Opt-Out: We do not sell data. You may opt-out of analytics "sharing" via our Cookie Banner.
-
Right to Non-Discrimination: We will not discriminate against you for exercising your privacy rights.
-
-
-
-
- How to Exercise Your Rights:
+
+
7. Contact and open source
+
+ Questions or concerns can be raised through the project repository. Self-hosting is available if you
+ want full infrastructure control.
-
-
Export Data: Use the "Export My Data" button in Settings to download your account metadata plus object-storage-backed document and audiobook files.
-
Delete Data: Use the "Delete Account" button in Settings.
-
-
-
-
-
-
-
- 5. Data Retention
-
-
- We retain your account data and uploaded files only for as long as you maintain an account.
- Uploaded documents are stored encrypted at rest (AES-256).
- Upon account deletion, all data is permanently removed from our active databases and storage buckets immediately.
-
-
-
-
-
-
- 6. US Processing & Location
-
- {isRichardrDevProductionInstance ? (
-
- For the official OpenReader instance, personal
- information is processed and stored in the United States.
- By using this service, you acknowledge that your data is handled
- in the US and that the service is available only for US users.
-
- ) : (
-
- Data processing location depends on your deployment and hosting
- provider configuration.
-
- )}
-
-
-
-
-
- 7. Contact Us
-
-
- If you have questions or concerns about this Privacy Policy, please contact the instance administrator via the repository:
-