CDN Manager — User Guide
A private CDN file management system. Upload via FTP or browser, organize with color tags, share direct links, and automate with a REST API.
🔐 Logging In
Visit your CDN Manager URL and sign in with your assigned credentials.
Open your CDN Manager URL
Navigate to your assigned URL, e.g. https://cdn.tasmoon.com/cto/
Enter your credentials
Use the username and password assigned to you. The login page also shows your FTP settings for quick reference.
You're in
The dashboard shows your files, upload zone, color filters, and settings. Your session stays active until you click Logout.
📊 Dashboard Overview
After login, the dashboard is divided into four main areas:
| Area | What it does |
|---|---|
| FTP Settings Panel | Shows your FTP connection details at a glance. Credentials are hidden by default — click to reveal. |
| Drag & Drop Zone | Upload files directly from your browser. Supports multiple files at once. |
| Color Filter Bar | Filter your file list by color tag. Shows count per color. |
| File Table | All your uploaded files with thumbnail, size, date, color dot, and copy-link button. |
🖼 Configuring FastStone Capture (FTP Upload)
FastStone Capture can automatically upload screenshots to your CDN via FTP. Here's how to set it up:
Open FastStone Capture → Settings → FTP
In FastStone, go to Settings → Output → FTP and click New to create a profile.
Enter your FTP credentials
Fill in the fields exactly as shown in the table below.
Enable Passive Mode
Check "Use Passive Mode (PASV)". This is required — active mode will not work through the server firewall.
Test connection & save
Click Test. You should see "Connection successful". Save the profile and set it as the default output.
FTP Settings Reference
| Field | Value | Notes |
|---|---|---|
| FTP Server / Host | cdn.tasmoon.com | Always use the hostname, not IP |
| Port | 21 | Standard FTP port |
| Username | your-username | e.g. cto, faststone |
| Password | your-password | Same as dashboard login password |
| Remote Directory | / | Leave as / — you are already chrooted to your folder |
| Connection Mode | PASSIVE | Required. Active mode is blocked by firewall |
| Encryption | None / Plain FTP | Do not enable FTPS or SFTP |
After Upload
Files uploaded via FastStone appear instantly in your dashboard the next time you load or refresh the page. They are automatically assigned the White color tag (meaning new / unreviewed).
The public URL for each file follows this pattern:
https://cdn.tasmoon.com/{your-username}/{filename.ext}
📂 Uploading via Drag & Drop
You can upload files directly from your browser without any FTP client. Any file type is supported.
Log in to your dashboard
Open your CDN Manager URL and sign in.
Drag files onto the upload zone
The large dashed area near the top says "Drag & drop files here". Drag one or more files from your desktop directly onto it. The zone highlights in blue when a file is hovering.
Or click "browse to upload"
Click the underlined browse to upload text to open a file picker instead. You can select multiple files at once using Ctrl+Click or Shift+Click.
Watch the progress & get your link
A progress bar appears. Each uploaded file shows a green checkmark and its direct public URL immediately — click to open or copy the link right away.
Page refreshes automatically
After all uploads complete the page reloads and your new files appear in the table with a White color dot.
📡 Using Any FTP Client
FileZilla, WinSCP, Cyberduck, or any other FTP client works. Use these settings:
| Setting | Value |
|---|---|
| Protocol | FTP (plain, not SFTP or FTPS) |
| Host | cdn.tasmoon.com |
| Port | 21 |
| Logon Type | Normal |
| Username | your-username |
| Password | your-password |
| Transfer Mode | PASSIVE |
| Default remote dir | / |
FileZilla Specific
In FileZilla: Edit → Settings → FTP → Transfer Mode → Passive. Also go to Site Manager, create a new site and set Transfer Settings → Transfer mode → Passive.
🎨 Color Code System
Every file has a color dot in the file list. Colors help you visually organize and categorize files. Click any color dot to change it.
How to Change a Color
Click the color dot
Each row has a colored circle in the second column. Click it to open the color picker popup.
Pick a color
Click any color swatch. The change is saved instantly to the database — no page reload needed.
Filtering by Color
The color filter bar above the file list shows all colors with a count badge. Click any color to filter the file list. Combine with the search box for precise results.
🔍 Search & Filter
Use the search box in the top-right of the filter bar to search by filename. Filtering by color and searching by name work together simultaneously.
banner in the search box.🖼️ Image Lightbox
Click any image thumbnail in the file list to open a fullscreen lightbox preview.
| Action | How |
|---|---|
| Open image | Click the thumbnail in the file list |
| Next image | Click › or press → |
| Previous image | Click ‹ or press ← |
| Close | Click ✕, click outside the image, or press Esc |
| Copy link | Click Copy Link inside the lightbox |
| Open original | Click Open Original to open full file in new tab |
🗑 Deleting Files
Select files with checkboxes
Tick the checkbox on each file you want to delete. Use the top-left checkbox to select all visible files.
Click "Delete Selected"
The red button appears once at least one file is selected. It shows how many files are selected.
Confirm
A confirmation dialog appears. Click OK to permanently delete. This cannot be undone.
⚡ REST API Reference
Each CDN account has its own api/ endpoint. All requests must include a valid Bearer token. The token is shown in the ⚙ Settings popup on your dashboard.
Base URL
https://cdn.tasmoon.com/{username}/api/
Authentication
Include your token as an Authorization header, or as a ?token= query parameter:
# Header method (recommended)
Authorization: Bearer your-api-token-here
# Query param method (for quick testing)
?token=your-api-token-here
Endpoints
| Param | Type | Description |
|---|---|---|
| color (optional) | string | Filter by color: white, red, orange, yellow, green, blue, purple, pink, gray |
| q (optional) | string | Search by filename substring |
// Response
{
"ok": true,
"total": 3,
"files": [
{
"filename": "banner.png",
"url": "https://cdn.tasmoon.com/cto/banner.png",
"size": 204800,
"color": "green",
"added_at": 1711234567
}
]
}
| Field | Type | Description |
|---|---|---|
| file required | binary | The file to upload (multipart/form-data) |
| color optional | string | Initial color tag. Defaults to white |
// Response
{
"ok": true,
"filename": "screenshot.png",
"url": "https://cdn.tasmoon.com/cto/screenshot.png",
"color": "white",
"size": 98304
}
| Field | Type | Description |
|---|---|---|
| filename required | string | Exact filename to update |
| color required | string | New color tag |
Returns filename, public URL, size, width, height, mime, color, note, added_at.
{
"ok": true,
"filename": "photo.jpg",
"url": "https://cdn.tasmoon.com/cto/photo.jpg",
"width": 4000,
"height": 2252,
"mime": "image/jpeg",
"size": 1601483,
"color": "green",
"added_at": 1711234567
}
| Param | Type | Description |
|---|---|---|
| url required | string | Public URL of the image to fetch |
| rename optional | string | Output filename without extension |
| color optional | string | Color tag. Defaults to blue |
| Param | Type | Description |
|---|---|---|
| url required | string | Public URL of the source image |
| quality optional | integer | WebP quality 1–100. Default: 85 |
| rename optional | string | Output filename without extension |
| Field | Type | Description |
|---|---|---|
| file required | binary | Image file (multipart/form-data). Original is deleted after conversion. |
| quality optional | integer | WebP quality 1–100. Default: 85 |
| rename optional | string | Output filename without extension |
| Param | Type | Description |
|---|---|---|
| file required | string | Filename |
| pct optional | number | Scale percent e.g. 50 for half size |
| width optional | integer | Target width in pixels |
| height optional | integer | Target height in pixels |
| fit optional | string | contain (default) | cover | fill |
| quality optional | integer | 1–100. Default: 85 |
| format optional | string | jpeg | webp | png (default: keep original) |
| rename optional | string | Output filename without extension |
| Param | Type | Description |
|---|---|---|
| file required | string | Filename |
| quality optional | integer | 1–100. Default: 75 |
| colors optional | integer | 0 = truecolor (default), 2–256 = palette reduction (best for PNG/GIF) |
| format optional | string | jpeg | webp | png |
| rename optional | string | Output filename. If omitted, overwrites original. |
{
"ok": true,
"size_before": 1601483,
"size_after": 591427,
"saved_bytes": 1010056
}
| Param | Type | Description |
|---|---|---|
| file required | string | Filename |
| x, y required | integer | Top-left corner in pixels |
| w, h required | integer | Width and height in pixels |
| rename optional | string | Output filename without extension |
| Param | Type | Description |
|---|---|---|
| file required | string | Filename |
| cols optional | integer | Columns. Default: 2 |
| rows optional | integer | Rows. Default: 1 |
| quality optional | integer | 1–100. Default: 85 |
| format optional | string | jpeg | webp | png |
| trim optional | 0/1 | Trim white borders from each tile |
| trim_threshold optional | integer | Brightness cutoff for trim (150–255). Default: 240 |
| Param | Type | Description |
|---|---|---|
| file required | string | Filename |
| v_cuts optional | string | Comma-separated vertical cut positions e.g. 200,400,600 |
| h_cuts optional | string | Comma-separated horizontal cut positions e.g. 300,600 |
| quality optional | integer | 1–100. Default: 85 |
| format optional | string | jpeg | webp | png |
| trim optional | 0/1 | Trim white borders from each tile |
| Param | Type | Description |
|---|---|---|
| file required | string | Filename |
| threshold optional | integer | Brightness level considered white (150–255). Default: 240 |
| min_gap optional | integer | Minimum band width in pixels. Default: 3 |
{
"ok": true,
"v_cuts": [195, 392],
"h_cuts": [260, 520],
"tiles": 9
}
| Param | Type | Description |
|---|---|---|
| files required | string | Comma-separated filenames e.g. a.jpg,b.jpg,c.jpg |
Returns a application/zip binary download named tiles.zip.
Also accepts GET. Returns {"ok":true,"deleted":"filename"}.
cURL Examples
# List all files
curl -H "Authorization: Bearer TOKEN" \
"https://cdn.tasmoon.com/cto/api/?action=list"
# Upload a file
curl -H "Authorization: Bearer TOKEN" \
-F "file=@/path/to/image.png" \
"https://cdn.tasmoon.com/cto/api/?action=upload"
# Fetch image from URL and convert to WebP
curl -H "Authorization: Bearer TOKEN" \
"https://cdn.tasmoon.com/cto/api/?action=upload_url_webp&url=https://example.com/photo.jpg&quality=85"
# Compress a file in place (70% quality)
curl -H "Authorization: Bearer TOKEN" \
"https://cdn.tasmoon.com/cto/api/?action=compress&file=photo.jpg&quality=70"
# Resize to 50%
curl -H "Authorization: Bearer TOKEN" \
"https://cdn.tasmoon.com/cto/api/?action=resize&file=photo.jpg&pct=50&format=webp"
# Slice into 4×4 grid
curl -H "Authorization: Bearer TOKEN" \
"https://cdn.tasmoon.com/cto/api/?action=slice&file=photo.jpg&cols=4&rows=4&trim=1"
# Delete a file
curl -H "Authorization: Bearer TOKEN" \
"https://cdn.tasmoon.com/cto/api/?action=delete&file=photo.jpg"
🤖 AI Integration (MCP & ChatGPT)
Your CDN can be controlled directly from AI assistants — Claude Desktop via MCP, or ChatGPT via Custom GPT Actions.
Claude Desktop — MCP Server
MCP (Model Context Protocol) lets Claude Desktop call your CDN as a set of tools. Claude can list files, compress, resize, slice, and more — all through natural language.
pip install mcp httpx
curl -o mcp_server.py https://cdn.tasmoon.com/{username}/mcp_server.py
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"cdn": {
"command": "python3",
"args": ["/path/to/mcp_server.py"],
"env": {
"CDN_API_BASE": "https://cdn.tasmoon.com/{username}/api",
"CDN_API_TOKEN": "your-api-token-here"
}
}
}
}
Available tools in Claude
| Tool | What you can say |
|---|---|
| list_files | "Show me all my files" / "List files tagged yellow" |
| file_info | "What are the dimensions of photo.jpg?" |
| upload_file | "Upload /home/user/banner.png to my CDN" |
| upload_as_webp | "Upload photo.jpg and convert it to WebP" |
| resize_file | "Resize banner.png to 50%" / "Make it 1200px wide" |
| compress_file | "Compress photo.jpg to 70% quality and replace it" |
| crop_file | "Crop photo.jpg to 500×400 starting at 100,100" |
| slice_grid | "Slice banner.jpg into a 4×4 grid" |
| slice_at_lines | "Slice at vertical positions 200, 400, 600" |
| detect_gaps | "Find the white gaps in spritesheet.png" |
| set_color_tag | "Tag photo.jpg as green" |
| delete_file | "Delete old_banner.jpg" |
ChatGPT — Custom GPT Actions
You can connect the CDN API to a Custom GPT so ChatGPT can manage your files.
https://cdn.tasmoon.com/{username}/api/openapi.json
upload_url or upload_url_webp instead — give ChatGPT a public image URL and it will fetch and save it.Example ChatGPT prompts
# Save an image from the web
Save https://example.com/photo.jpg to my CDN as WebP
# Compress and organize
Compress all files larger than 1MB to 70% quality
# Slice a spritesheet
Detect the gaps in spritesheet.png then slice it and trim the borders
🔗 n8n Integration
Use n8n's HTTP Request node to automate file uploads and management. Below is the complete setup for each use case.
After a successful upload, the response contains the direct URL. Access it in your next node with:
// In a Set or Code node after the HTTP Request:
{{ $json.url }}
// Example response you'll receive:
{
"ok": true,
"filename": "report_2024.pdf",
"url": "https://cdn.tasmoon.com/cto/report_2024.pdf",
"color": "white",
"size": 512000
}
A common n8n workflow for automated screenshot or report delivery:
Trigger (Schedule / Webhook)
↓
Generate or fetch the file
(Read Binary File / HTTP Request / etc.)
↓
Upload to CDN
HTTP Request POST → api/?action=upload
→ Get {{ $json.url }}
↓
Use the URL
(Send in Slack, email, save to Airtable, etc.)
↓
Tag as delivered
HTTP Request POST → api/?action=color { color: "green" }
🔑 Managing Your API Token
Find your token
Log in to your dashboard, then click the ⚙ gear icon in the top-right corner.
Reveal & copy
Token is hidden by default. Click Show to reveal it, then Copy to copy to clipboard.
Regenerate if compromised
Click Regenerate. A new 48-character random token is generated immediately. The old token stops working at once — update all your n8n workflows and integrations.
⚙️ Automatic Rules
| Rule | Behaviour |
|---|---|
| New file color | All newly uploaded files (via FTP or browser) start with White color tag. |
| 90-day auto-archive | On every dashboard login, files older than 90 days that are still White (not manually re-tagged) are automatically changed to Gray. |
| FTP sync | Files uploaded via FTP appear in the dashboard on your next page load — the DB auto-syncs with the filesystem. |
| Filename sanitization | Special characters in filenames are replaced with underscores on upload. Duplicate filenames get a timestamp suffix. |
| File permissions | Uploaded files are set to 644 automatically — readable by the web server so direct URLs always work. |
💡 Tips & Best Practices
homepage-banner-2024.jpg instead of img001.jpg. Search works on filenames.?color=green filter in n8n to periodically pull only approved files for downstream processes — a simple content approval workflow without extra tools.CDN Manager · cdn.tasmoon.com · Back to Dashboard