v1.0
← Dashboard

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.

FTP Upload
Drag & Drop
Color Tags
Image Lightbox
REST API
n8n Ready
ℹ️
Each user has their own isolated folder, login, and FTP account. Files are only visible to the owner when logged in. Uploaded files are publicly accessible via direct URL — share links freely.

🔐 Logging In

Visit your CDN Manager URL and sign in with your assigned credentials.

1

Open your CDN Manager URL

Navigate to your assigned URL, e.g. https://cdn.tasmoon.com/cto/

2

Enter your credentials

Use the username and password assigned to you. The login page also shows your FTP settings for quick reference.

3

You're in

The dashboard shows your files, upload zone, color filters, and settings. Your session stays active until you click Logout.

💡
Your login password is the same as your FTP password. No need to remember two passwords.

📊 Dashboard Overview

After login, the dashboard is divided into four main areas:

AreaWhat it does
FTP Settings PanelShows your FTP connection details at a glance. Credentials are hidden by default — click to reveal.
Drag & Drop ZoneUpload files directly from your browser. Supports multiple files at once.
Color Filter BarFilter your file list by color tag. Shows count per color.
File TableAll your uploaded files with thumbnail, size, date, color dot, and copy-link button.
⚙️
Click the gear icon ⚙ in the top-right to open API settings — your token, endpoint docs, and n8n setup guide.

🖼 Configuring FastStone Capture (FTP Upload)

FastStone Capture can automatically upload screenshots to your CDN via FTP. Here's how to set it up:

1

Open FastStone Capture → Settings → FTP

In FastStone, go to Settings → Output → FTP and click New to create a profile.

2

Enter your FTP credentials

Fill in the fields exactly as shown in the table below.

3

Enable Passive Mode

Check "Use Passive Mode (PASV)". This is required — active mode will not work through the server firewall.

4

Test connection & save

Click Test. You should see "Connection successful". Save the profile and set it as the default output.

FTP Settings Reference

FieldValueNotes
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
⚠️
Passive Mode is mandatory. If you leave it on Active Mode, the data connection will time out and uploads will fail. Always tick the "Passive Mode (PASV)" checkbox.

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}

📱 Share Images from Your Phone

The CDN Manager works as an installable app on Android and iOS. Once installed, it appears as a destination in your phone's native Share menu — just like sharing to WhatsApp or Telegram.

Step 1 — Install the App

A

Android (Chrome)

Open your CDN Manager URL in Chrome. Tap the three-dot menu → "Add to Home screen". Or wait for the install banner to appear automatically at the top of the dashboard.

B

iPhone / iPad (Safari)

Open your URL in Safari. Tap the Share button (box with arrow) → "Add to Home Screen". Give it a name and tap Add.

Step 2 — Share an Image

1

Open your Photos / Gallery app

Select any image or file you want to upload to your CDN.

2

Tap Share

Tap the native Share button. On Android it is usually at the bottom of the screen. On iPhone it is the box-with-arrow icon.

3

Select "CDN Manager"

Scroll through the share sheet and tap your installed CDN Manager app. You may need to scroll to "More" on iOS to find it the first time.

4

Upload completes instantly

The app opens, uploads the image, and shows a green banner with the direct public URL. Tap Copy Link to copy it to your clipboard immediately.

You must be already logged in to the CDN Manager app for the share upload to work. If you are not logged in, you will see the login page — log in, then share again.
📎
The Share Target supports images, videos, and PDFs. Special characters in filenames are sanitized automatically. If a file with the same name already exists, a timestamp is appended.

📂 Uploading via Drag & Drop

You can upload files directly from your browser without any FTP client. Any file type is supported.

1

Log in to your dashboard

Open your CDN Manager URL and sign in.

2

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.

3

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.

4

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.

5

Page refreshes automatically

After all uploads complete the page reloads and your new files appear in the table with a White color dot.

📏
Maximum upload size is 512 MB per file. If a filename already exists, a timestamp is automatically appended to avoid overwriting.

📡 Using Any FTP Client

FileZilla, WinSCP, Cyberduck, or any other FTP client works. Use these settings:

SettingValue
ProtocolFTP (plain, not SFTP or FTPS)
Hostcdn.tasmoon.com
Port21
Logon TypeNormal
Usernameyour-username
Passwordyour-password
Transfer ModePASSIVE
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.

White
New / Unreviewed (default)
Red
Urgent / Important
Orange
Pending / In Progress
Yellow
Review / Attention
Green
Approved / Done
Blue
General / Reference
Purple
Design / Creative
Pink
Personal / Marketing
Gray
Archived (auto after 90 days)
Auto-archiving: Files that have not been manually re-tagged and are older than 90 days are automatically set to Gray each time you log in. This keeps your active files easy to find.

How to Change a Color

1

Click the color dot

Each row has a colored circle in the second column. Click it to open the color picker popup.

2

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.

🗑 Deleting Files

1

Select files with checkboxes

Tick the checkbox on each file you want to delete. Use the top-left checkbox to select all visible files.

2

Click "Delete Selected"

The red button appears once at least one file is selected. It shows how many files are selected.

3

Confirm

A confirmation dialog appears. Click OK to permanently delete. This cannot be undone.

⚠️
File deletion is permanent. There is no recycle bin or undo. Make sure before confirming.

⚡ 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
🔑
Keep your API token private. If compromised, regenerate it from the ⚙ Settings popup. Old tokens stop working immediately.

Endpoints

GET api/?action=list List all files
ParamTypeDescription
color (optional)stringFilter by color: white, red, orange, yellow, green, blue, purple, pink, gray
q (optional)stringSearch 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
    }
  ]
}
POST api/?action=upload Upload a file
FieldTypeDescription
file requiredbinaryThe file to upload (multipart/form-data)
color optionalstringInitial color tag. Defaults to white
// Response
{
  "ok":       true,
  "filename": "screenshot.png",
  "url":      "https://cdn.tasmoon.com/cto/screenshot.png",
  "color":    "white",
  "size":     98304
}
POST api/?action=color Set color tag
FieldTypeDescription
filename requiredstringExact filename to update
color requiredstringNew color tag
GET api/?action=info&file={filename} Get file details

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
}
GET api/?action=upload_url Fetch an image from a URL and save it
ParamTypeDescription
url requiredstringPublic URL of the image to fetch
rename optionalstringOutput filename without extension
color optionalstringColor tag. Defaults to blue
GET api/?action=upload_url_webp Fetch an image from a URL, convert to WebP, and save
ParamTypeDescription
url requiredstringPublic URL of the source image
quality optionalintegerWebP quality 1–100. Default: 85
rename optionalstringOutput filename without extension
POST api/?action=upload_webp Upload a file and convert it to WebP
FieldTypeDescription
file requiredbinaryImage file (multipart/form-data). Original is deleted after conversion.
quality optionalintegerWebP quality 1–100. Default: 85
rename optionalstringOutput filename without extension
GET api/?action=resize Resize an image
ParamTypeDescription
file requiredstringFilename
pct optionalnumberScale percent e.g. 50 for half size
width optionalintegerTarget width in pixels
height optionalintegerTarget height in pixels
fit optionalstringcontain (default) | cover | fill
quality optionalinteger1–100. Default: 85
format optionalstringjpeg | webp | png (default: keep original)
rename optionalstringOutput filename without extension
GET api/?action=compress Compress an image (overwrites original by default)
ParamTypeDescription
file requiredstringFilename
quality optionalinteger1–100. Default: 75
colors optionalinteger0 = truecolor (default), 2–256 = palette reduction (best for PNG/GIF)
format optionalstringjpeg | webp | png
rename optionalstringOutput filename. If omitted, overwrites original.
{
  "ok":           true,
  "size_before":  1601483,
  "size_after":   591427,
  "saved_bytes":  1010056
}
GET api/?action=crop Crop an image to a rectangle
ParamTypeDescription
file requiredstringFilename
x, y requiredintegerTop-left corner in pixels
w, h requiredintegerWidth and height in pixels
rename optionalstringOutput filename without extension
GET api/?action=slice Slice an image into a grid of tiles
ParamTypeDescription
file requiredstringFilename
cols optionalintegerColumns. Default: 2
rows optionalintegerRows. Default: 1
quality optionalinteger1–100. Default: 85
format optionalstringjpeg | webp | png
trim optional0/1Trim white borders from each tile
trim_threshold optionalintegerBrightness cutoff for trim (150–255). Default: 240
GET api/?action=slice_lines Slice at specific pixel positions
ParamTypeDescription
file requiredstringFilename
v_cuts optionalstringComma-separated vertical cut positions e.g. 200,400,600
h_cuts optionalstringComma-separated horizontal cut positions e.g. 300,600
quality optionalinteger1–100. Default: 85
format optionalstringjpeg | webp | png
trim optional0/1Trim white borders from each tile
GET api/?action=detect_gaps Auto-detect white bands for slicing
ParamTypeDescription
file requiredstringFilename
threshold optionalintegerBrightness level considered white (150–255). Default: 240
min_gap optionalintegerMinimum band width in pixels. Default: 3
{
  "ok":      true,
  "v_cuts": [195, 392],
  "h_cuts": [260, 520],
  "tiles":   9
}
GET api/?action=download_zip Download multiple files as a ZIP
ParamTypeDescription
files requiredstringComma-separated filenames e.g. a.jpg,b.jpg,c.jpg

Returns a application/zip binary download named tiles.zip.

DELETE api/?action=delete&file={filename} Delete a file

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.

📋
Step 1 — Install dependencies on your local machine:
pip install mcp httpx
⬇️
Step 2 — Download the MCP server from your CDN instance:
curl -o mcp_server.py https://cdn.tasmoon.com/{username}/mcp_server.py
⚙️
Step 3 — Add to Claude Desktop config

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"
      }
    }
  }
}
🔄
Step 4 — Fully restart Claude Desktop. It will now show a 🔌 icon indicating the CDN tools are active.

Available tools in Claude

ToolWhat 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.

1️⃣
Go to ChatGPT → Explore GPTs → Create → Configure → Actions → Create new action
2️⃣
Import the schema URL:
https://cdn.tasmoon.com/{username}/api/openapi.json
3️⃣
Set Authentication → API Key → Bearer and paste your API token.
⚠️
ChatGPT Actions cannot upload binary files from the user's device. Use 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.

Step 1 Upload a File from n8n
Node Type HTTP Request Method POST URL https://cdn.tasmoon.com/{username}/api/?action=upload AuthenticationHeader Auth Name Authorization Value Bearer YOUR_API_TOKEN Send Body Form Data (multipart) Body Field: fileBinary — connect to previous node's binary output Body Field: colorwhite (or any color tag)
Step 2 Get the Public URL from the Response

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
}
Step 3 Tag a File after Processing
Node Type HTTP Request Method POST URL https://cdn.tasmoon.com/{username}/api/?action=color AuthenticationHeader Auth → Bearer YOUR_TOKEN Send Body Form Data filename {{ $json.filename }} color green
Workflow Full Automation Example

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" }
💡
In n8n, if you store your API token as a Credential → Header Auth, you can reuse it across all HTTP Request nodes without hard-coding it in each workflow.

🔑 Managing Your API Token

1

Find your token

Log in to your dashboard, then click the ⚙ gear icon in the top-right corner.

2

Reveal & copy

Token is hidden by default. Click Show to reveal it, then Copy to copy to clipboard.

3

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

RuleBehaviour
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

📁
Use descriptive filenames. Since files are served publicly by filename, use clear names like homepage-banner-2024.jpg instead of img001.jpg. Search works on filenames.
🎨
Establish a color convention with your team. For example: White = new, Yellow = needs review, Green = approved for use, Gray = archived. Consistent tagging makes filtering much more powerful.
🔗
Copy links from the lightbox. When sharing a specific image, open the lightbox first and use the Copy Link button there — it's faster than scanning the table.
Use the API ?color=green filter in n8n to periodically pull only approved files for downstream processes — a simple content approval workflow without extra tools.
🔒
Your CDN URL is public. Anyone with a direct file URL can access it — there is no file-level password protection. Do not upload sensitive or confidential files.
🗑
Deletion is permanent. There is no trash / undo. Double-check before confirming a batch delete.

CDN Manager · cdn.tasmoon.com · Back to Dashboard