PasteFlix Documentation
The complete, pin-to-pin guide to every feature of PasteFlix — a privacy-first, dark-themed Markdown pastebin built for developers and power users. This document covers the editor, all settings, Markdown syntax, the REST API, keyboard shortcuts, and more.
Getting Started
Creating your first paste takes three simple steps:
Navigate to the homepage. The full-featured Markdown editor loads instantly. Type or paste your content into the editor. Use the Markdown, Preview, or Split tabs to see your work rendered in real-time.
Scroll down below the editor to the Document Settings panel. Here you can set a Title (required, max 100 chars), choose Visibility (Public or Private), add an optional Password (min 4, max 30 chars), set an Edit Key for future modifications, and pick an Expiration Date & Time.
Click the Publish button. Your paste is instantly saved to our secure storage and you are redirected to a unique, SEO-friendly URL like /p/my-document-title. Share this URL with anyone.
The Editor
The PasteFlix editor is a full-featured Markdown authoring environment. It consists of three main areas: the Tab Bar, the Toolbar, and the Text Area.
Editor Tabs
The raw text editor. Type your Markdown here. Supports all standard Markdown plus our extended syntax.
A full-page read-only preview showing the final rendered output with syntax highlighting, tables, and all formatting applied.
Side-by-side view with the editor on the left and live preview on the right. Includes optional Scroll Sync to keep both panels aligned.
The Toolbar
The toolbar provides quick-access buttons for all formatting actions. It is divided into groups:
The "..." button opens a comprehensive dropdown with additional formatting and insert options:
The Containers submenu lets you insert styled callout blocks: Tip Info Warning Danger
Markdown Reference
PasteFlix uses a powerful Markdown engine with extensive plugin support. Below is every supported syntax element with examples.
Basic Syntax
Standard GFM elements supported by our engine.
Headings
Emphasis
Quotes
Lists (Deep Embedding)
Task Lists
Links & Image Sizing
Tables
Horizontal Rules & Misc
Extended Syntax
Advanced features powered by our specialized plugins.
Scripts & Formatting
Emojis & Shortcuts
Abbreviations
Footnotes
Spoilers
Definitions (Advanced)
Code Blocks
Rich code blocks with language badges, copying, and toggles.
Custom Containers (Callouts)
Specialized containers for highlighting info, tips, or warnings.
Document Settings
Every paste has configurable settings accessible from the panel below the editor. Here is a detailed breakdown of each field:
The title of your document. This is used to generate the URL slug (e.g., "My Cool Paste" becomes /p/my-cool-paste). If a slug already exists, a random 2-character suffix is appended. Max 100 characters.
Public: The paste is accessible by anyone with the URL. Default option.
Private (Unlisted): The paste can only be accessed by those who have the exact URL. It is not indexed or discoverable.
When a password is set (min 4, max 30 characters), visitors must enter the correct password before the paste content is revealed. The content is never sent to the browser until the correct password is provided server-side. If no password is set, the paste is freely accessible. A validation hint is displayed only if the entered password is shorter than the required minimum.
An optional secret key (min 4, max 30 characters) that enables editing. If set, an "Edit paste" link appears on the viewer page. Clicking it takes you to /edit/[id] where you must provide the Edit Key. The Edit Key is never exposed in the API responses. Without it, a paste is permanently read-only. A validation hint is shown only when the rules are violated.
Set a precise date and time for auto-expiry using the date-time picker. After the expiry time, the paste returns a 410 Gone status. The expiry date is displayed on the viewer page. If left empty, the paste lives indefinitely.
Viewing Pastes
When you visit a paste URL (/p/[id]), the viewer page renders with:
- Title — Displayed as a large heading at the top
- Metadata — Creation date, expiry date (if set), "Create your own paste" link
- Edit Link — Shown only if the paste has an Edit Key configured
- Rendered Markdown — Full GFM rendering with syntax highlighting, tables, containers, spoilers, and more
- Raw Mode — If the paste was published in Raw mode, content is shown as plain preformatted text
- Password Gate — If password-protected, a password input form is shown instead of the content
- Expired State — If the paste has expired, a notice is shown with a link to create a new paste
Editing Pastes
If you set an Edit Key during creation, you can update your paste later:
- Navigate to the paste viewer page (
/p/[id]) - Click the "Edit paste" link in the metadata bar
- You are taken to
/edit/[id]and prompted for your Edit Key - Upon successful verification, the full editor loads with your existing content pre-filled
- Make your changes and click "Update Paste"
- All fields (title, content, visibility, password, edit key, expiry) can be changed
Security & Privacy
When a paste is password protected, the API returns only the title and metadata. The actual content is never transmitted to the client until the correct password is verified on the server. There is no client-side decryption — the protection is enforced at the API layer.
The Edit Key is stored in the database but is never included in any API GET response. It is stripped from the response object before being sent to the client using object destructuring.
All API endpoints are rate-limited per IP address: 5 requests/minute for POST and PUT, and 30 requests/minute for GET. Exceeding these limits returns a 429 Too Many Requests response.
PasteFlix does not use cookies, analytics, or any form of user tracking. There are no third-party scripts loaded beyond the core libraries.
Developer API
PasteFlix exposes a REST API for programmatic access. Base URL: your deployment domain. All endpoints accept and return application/json.
Open Interactive API Explorer (Swagger UI)
POST/api/pastes
Creates a new paste. Returns the generated ID and URL.
Request Body
| Field | Type | Status | Description |
|---|---|---|---|
| title | string | Required | Document title. Max 100 characters. |
| content | string | Required | The Markdown or plain text content of the paste. |
| raw | boolean | Optional | If true, content is displayed as plain text (no Markdown rendering). Default: false. |
| visibility | string | Optional | Either "public" or "private". Default: "public". |
| password | string | Optional | Optional password to protect the paste. Min 4 characters. |
| editKey | string | Optional | Optional key to enable future editing. Min 4 characters. |
| expiresAt | ISO 8601 | Optional | Optional expiry timestamp, e.g., "2026-03-01T00:00:00Z". |
Example
bashcurl -X POST https://your-domain.com/api/pastes \ -H "Content-Type: application/json" \ -d '{ "title": "My First Paste", "content": "# Hello World\nThis is **Markdown**.", "visibility": "public", "editKey": "my-secret-key" }'
json (response 201){ "success": true, "id": "my-first-paste", "url": "https://your-domain.com/p/my-first-paste" }
GET/api/pastes/{id}
Retrieves a paste by its ID. If the paste is password-protected, include the ?password= query parameter.
Parameters
| Field | Type | Status | Description |
|---|---|---|---|
| id | string (path) | Required | The unique paste ID (URL slug). |
| password | string (query) | Optional | Required only if the paste is password-protected. |
Example
bash# Public paste curl https://your-domain.com/api/pastes/my-first-paste # Password-protected paste curl "https://your-domain.com/api/pastes/my-first-paste?password=secret123"
json (response 200){ "success": true, "paste": { "id": "my-first-paste", "title": "My First Paste", "content": "# Hello World\nThis is **Markdown**.", "raw": false, "visibility": "public", "createdAt": { "seconds": 1772027530 }, "hasEditKey": true } }
PUT/api/pastes/{id}
Updates an existing paste. Requires the current Edit Key for authorization.
Request Body
| Field | Type | Status | Description |
|---|---|---|---|
| editKey | string | Required | The current edit key that was set during creation. |
| title | string | Required | Updated title. Max 100 characters. |
| content | string | Required | Updated content. |
| raw | boolean | Optional | Toggle raw mode. |
| visibility | string | Optional | Change to "public" or "private". |
| password | string | Optional | Set or change the password. Send null to remove. |
| expiresAt | ISO 8601 | Optional | Set or change the expiry. Send null to remove. |
| newEditKey | string | Optional | Change the edit key itself. Min 4 characters. Send null to remove. |
Example
bashcurl -X PUT https://your-domain.com/api/pastes/my-first-paste \ -H "Content-Type: application/json" \ -d '{ "editKey": "my-secret-key", "title": "Updated Title", "content": "# Updated Content\nNew stuff here." }'
json (response 200){ "success": true, "id": "my-first-paste" }
Rate Limits
5 requests per minute per IP
30 requests per minute per IP
5 requests per minute per IP
Error Codes
| Field | Type | Status | Description |
|---|---|---|---|
| 400 | Bad Request | Optional | Missing or invalid fields (e.g., empty title, content too short). |
| 401 | Unauthorized | Optional | Invalid password or invalid/missing edit key. |
| 404 | Not Found | Optional | The paste ID does not exist in the database. |
| 410 | Gone | Optional | The paste existed but has expired past its expiresAt date. |
| 429 | Rate Limited | Optional | Too many requests from this IP. Wait and retry. |
| 500 | Server Error | Optional | An unexpected error occurred. Check request body JSON validity. |
Keyboard Shortcuts
The full list of keyboard shortcuts available in the editor. These can also be viewed from the Keyboard icon in the toolbar.
Styles
Headers
Insert
Lists
System
Frequently Asked Questions
How is the URL slug generated?
The slug is derived from your document title, lowercased and stripped of special characters. If a slug collision occurs, a 2-character random alphanumeric suffix is appended (e.g., my-paste-k3).
Can I delete a paste?
There is no explicit delete endpoint. If you have the Edit Key, you can clear the content or set an expiry in the past. Pastes with an expiry date will automatically become inaccessible after that time with a 410 Gone status.
Is there a size limit on pastes?
Yes. PasteFlix enforces a **hard 1MB limit** (1,048,576 bytes) per paste. This is equivalent to approximately 1 million plain text characters. If your content exceeds this limit, the editor will block publishing and show a warning message.
Can I recover a lost Edit Key?
No. Edit Keys are stored securely and never returned in API responses. If you lose your Edit Key, you cannot edit the paste. Always save it somewhere safe.
What Markdown plugins are used?
PasteFlix uses a high-performance Markdown engine with support for: emoji, sub, sup, underline, highlights, footnotes, definition lists, abbreviations, custom callout containers (tip/info/warning/danger), spoilers, task-lists, and code syntax highlighting.
Does PasteFlix use cookies or track users?
No. PasteFlix has zero tracking, zero cookies, and loads no third-party analytics scripts.
Can I use the API without authentication?
Yes. The API is fully public. Rate limiting is enforced per IP address.
What happens when a paste expires?
Expired pastes return a 410 Gone HTTP status. The viewer page shows a dedicated 'This Paste Has Expired' notice with a link to create a new paste.
