diff --git a/.DS_Store b/.DS_Store index 05048feaa6bd15f0141eb172c5e5cc7485890aba..14a5e401b2cc925451aa6f366814c49cb32d53c6 100644 GIT binary patch delta 50 zcmZp1XmOa}&nUYwU^hRb>}DPTYeoTPhGd2mhP;&G#Sc9I delta 38 ucmZp1XmOa}&nUAoU^hRb%w`?|YsSgb1Z6ju3qE1m?7_32c{97jUv>cU5)6+3 diff --git a/cdn/about.html b/cdn/about.html new file mode 100644 index 0000000..8953f6e --- /dev/null +++ b/cdn/about.html @@ -0,0 +1,134 @@ + + + + + + About MBD CDN - madebydanny.uk + + + + + + + + + + + + +
+ + +
+

About MBD CDN

+
+

The MBD CDN is a content delivery network built by madebydanny.uk to host and serve media files - images, GIFs, and videos - at extremely fast speeds with global availability.

+

Files uploaded to the CDN are stored in Cloudflare R2 object storage and served from Cloudflare's global edge network, which spans over 310 cities worldwide. This means your media is delivered from a server geographically close to whoever is viewing it - minimising latency and maximising load speed.

+

The platform is designed to be simple and permanent. Files are stored indefinitely once uploaded and are immediately available via a public URL.

+
+ +
+ +

Social Links

+ +
+
+ + + + + + diff --git a/cdn/how-it-works.html b/cdn/how-it-works.html new file mode 100644 index 0000000..b493f75 --- /dev/null +++ b/cdn/how-it-works.html @@ -0,0 +1,210 @@ + + + + + + How MBD CDN Works - madebydanny.uk + + + + + + + + + + + + +
+ + +
+

How it Works

+

From the moment you click Upload to the moment someone loads your file - here's what happens.

+ +
+
+
1
+
+

You select a file

+

Your file is read locally in the browser and sent directly to the CDN API over HTTPS. It goes straight to the Cloudflare edge - no intermediate servers involved.

+
+
+
+
2
+
+

The Worker receives it

+

A Cloudflare Worker handles the upload at the edge. It assigns a UUID filename, detects the file type, and streams the body directly into R2 object storage - with no cold starts and near-instant response times.

+
+
+
+
3
+
+

R2 stores it permanently

+

The file is written to Cloudflare R2 - S3-compatible storage with zero egress fees and 11 nines of durability. Upload metadata is logged to D1 (Cloudflare's edge SQL database) to track stats.

+
+
+
+
4
+
+

You get a public URL

+

A permanent public-cdn.madebydanny.uk link is returned instantly. Anyone with it can access the file - served from whichever Cloudflare PoP is closest to them.

+
+
+
+ +
+
+ +

310+ Edge Locations

+

Files are cached and served globally - sub-50ms for most users regardless of where they are.

+
+
+ +

R2 Object Storage

+

Zero egress fees, no expiry. Files are stored in Cloudflare R2 with enterprise-grade durability.

+
+
+ +

Zero Cold Starts

+

Workers run at the edge with no spin-up delay - every upload and file request is handled immediately.

+
+
+
+
+ + + + diff --git a/cdn.html b/cdn/index.html similarity index 79% rename from cdn.html rename to cdn/index.html index 81515a3..5b382b6 100644 --- a/cdn.html +++ b/cdn/index.html @@ -548,7 +548,7 @@ @@ -583,15 +583,15 @@ - - - +
@@ -639,148 +639,6 @@
- -
-
-

About MBD CDN

-
-

The MBD CDN is a content delivery network built by madebydanny.uk to host and serve media files — images, GIFs, and videos — at extremely fast speeds with global availability.

-

Files uploaded to the CDN are stored in Cloudflare R2 object storage and served from Cloudflare's global edge network, which spans over 310 cities worldwide. This means your media is delivered from a server geographically close to whoever is viewing it — minimising latency and maximising load speed.

-

The platform is designed to be simple and permanent. Files are stored indefinitely once uploaded and are immediately available via a public URL.

-
- -
- -

Social Links

- -
-
- - -
-
-

How it Works

-

From the moment you click Upload to the moment someone loads your file — here's what happens.

- -
-
-
1
-
-

You select a file

-

Your file is read locally in the browser and sent directly to the CDN API over HTTPS. It goes straight to the Cloudflare edge — no intermediate servers involved.

-
-
-
-
2
-
-

The Worker receives it

-

A Cloudflare Worker handles the upload at the edge. It assigns a UUID filename, detects the file type, and streams the body directly into R2 object storage — with no cold starts and near-instant response times.

-
-
-
-
3
-
-

R2 stores it permanently

-

The file is written to Cloudflare R2 — S3-compatible storage with zero egress fees and 11 nines of durability. Upload metadata is logged to D1 (Cloudflare's edge SQL database) to track stats.

-
-
-
-
4
-
-

You get a public URL

-

A permanent public-cdn.madebydanny.uk link is returned instantly. Anyone with it can access the file — served from whichever Cloudflare PoP is closest to them.

-
-
-
- -
-
- -

310+ Edge Locations

-

Files are cached and served globally — sub-50ms for most users regardless of where they are.

-
-
- -

R2 Object Storage

-

Zero egress fees, no expiry. Files are stored in Cloudflare R2 with enterprise-grade durability.

-
-
- -

Zero Cold Starts

-

Workers run at the edge with no spin-up delay — every upload and file request is handled immediately.

-
-
-
-
- - -
-
-

Usage Limits

-

Fair-use limits are in place to keep the CDN reliable and available for everyone.

- -
-
- -
100 MB
-
Max File Size
-
Per individual upload
-
-
- -
—
-
Daily Storage
-
Total uploads per day
-
-
- -
—
-
Uploads Per Day
-
Resets at midnight UTC
-
-
- -
- - All limits reset daily at midnight UTC. They are enforced per IP to protect performance for all users. If you need higher limits, consider self-hosting the stack or get in touch via the social links in the About section. -
- -
-

Your Usage Today

-
Loading your usage…
- -
- -
- -

Accepted File Types

-

- Images: JPEG, PNG, WebP, AVIF, SVG    - Animated: GIF    - Video: MP4, WebM, MOV -

-
-
- @@ -1020,7 +878,7 @@ // ── SOCIAL LINKS FALLBACK ───────────────────────────── window.addEventListener('load', () => { const el = document.getElementById('social-links'); - if (!el.children.length) { + if (el && !el.children.length) { el.innerHTML = ` madebydanny.uk @@ -1043,4 +901,4 @@ - \ No newline at end of file + diff --git a/cdn/limits.html b/cdn/limits.html new file mode 100644 index 0000000..3e8954c --- /dev/null +++ b/cdn/limits.html @@ -0,0 +1,152 @@ + + + + + + MBD CDN Limits - madebydanny.uk + + + + + + + + + + + + +
+ +
+

Usage Limits

+

Fair-use limits are in place to keep the CDN reliable and available for everyone.

+ +
+
+ +
100 MB
+
Max File Size
+
Per individual upload
+
+
+ +
-
+
Daily Storage
+
Total uploads per day
+
+
+ +
-
+
Uploads Per Day
+
Resets at midnight UTC
+
+
+ +
+ + All limits reset daily at midnight UTC. They are enforced per IP to protect performance for all users. If you need higher limits, consider self-hosting the stack or get in touch via the social links in the About section. +
+ +
+

Your Usage Today

+
Loading your usage...
+ +
+ +
+ +

Accepted File Types

+

+ Images: JPEG, PNG, WebP, AVIF, SVG    + Animated: GIF    + Video: MP4, WebM, MOV +

+
+
+ + + + + + diff --git a/css/cdn/limits.css b/css/cdn/limits.css new file mode 100644 index 0000000..9e4e8c6 --- /dev/null +++ b/css/cdn/limits.css @@ -0,0 +1,126 @@ + :root { + --bg: #121212; + --card-bg: #4a2b32; + --stat-bg: #2a1a21; + --text: #fff; + --subtext: #dcbaba; + --link: #ffcccc; + --border: rgba(255,255,255,0.1); + --red: #ff6b6b; + } + + * { box-sizing: border-box; margin: 0; padding: 0; } + body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + background: var(--bg); + color: var(--text); + line-height: 1.5; + min-height: 100vh; + } + + a { color: var(--link); text-decoration: none; } + a:hover { text-decoration: underline; } + + .site-header { + text-align: center; + padding: 44px 20px 10px; + max-width: 900px; + margin: 0 auto; + } + + .site-header h1 { font-size: 2rem; margin-bottom: 8px; } + .site-header p { color: var(--subtext); font-size: 0.95rem; } + + .tabs-wrap { max-width: 900px; margin: 20px auto 0; padding: 0 20px; } + .tab-bar { + display: flex; + gap: 4px; + border-bottom: 1px solid var(--border); + overflow-x: auto; + scrollbar-width: none; + } + .tab-bar::-webkit-scrollbar { display: none; } + .tab-btn { + font-size: 0.9rem; + font-weight: 600; + color: var(--subtext); + border-bottom: 2px solid transparent; + padding: 10px 18px; + white-space: nowrap; + margin-bottom: -1px; + display: inline-block; + } + .tab-btn.active { color: var(--link); border-bottom-color: var(--link); } + + .card { + background: var(--card-bg); + border: 1px solid var(--border); + border-radius: 16px; + padding: 32px; + box-shadow: 0 6px 12px rgba(0,0,0,0.35); + margin-top: 26px; + } + + .card h2 { font-size: 1.25rem; margin-bottom: 8px; } + .desc { color: var(--subtext); font-size: 0.9rem; margin-bottom: 20px; } + hr.divider { border: none; border-top: 1px solid var(--border); margin: 28px 0; } + + .limits-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 14px; + } + + .limit-card { + background: linear-gradient(135deg, var(--stat-bg) 0%, #3f242b 100%); + border: 1px solid var(--border); + border-radius: 12px; + padding: 18px; + text-align: center; + } + + .limit-card i { font-size: 1.2rem; color: var(--link); } + .limit-value { margin-top: 10px; font-size: 1.45rem; font-weight: 700; } + .limit-label { color: var(--subtext); font-size: 0.78rem; text-transform: uppercase; margin-top: 2px; } + .limit-note { color: var(--subtext); opacity: 0.85; font-size: 0.75rem; margin-top: 6px; } + + .limits-note { + margin-top: 16px; + background: rgba(0,0,0,0.2); + border: 1px solid var(--border); + border-radius: 10px; + padding: 12px 14px; + font-size: 0.86rem; + color: var(--subtext); + } + .limits-note i { color: var(--red); margin-right: 4px; } + + .usage-section { + margin-top: 24px; + background: rgba(0,0,0,0.2); + border: 1px solid var(--border); + border-radius: 12px; + padding: 18px; + } + + .usage-section h2 { font-size: 1rem; margin-bottom: 12px; } + .usage-loading { color: var(--subtext); font-size: 0.9rem; } + .usage-row { display: flex; justify-content: space-between; font-size: 0.85rem; margin-bottom: 6px; } + .usage-track { height: 10px; background: rgba(255,255,255,0.08); border-radius: 999px; overflow: hidden; } + .usage-fill { height: 100%; width: 0%; background: linear-gradient(90deg, #6ee7a8, #34c759); transition: width 0.35s ease; } + .usage-fill.warn { background: linear-gradient(90deg, #ffd166, #fca311); } + .usage-fill.danger { background: linear-gradient(90deg, #ff8b8b, #ff5f5f); } + + .site-footer { + max-width: 900px; + margin: 26px auto 40px; + padding: 0 20px; + text-align: center; + color: var(--subtext); + font-size: 0.85rem; + } + + @media (max-width: 780px) { + .limits-grid { grid-template-columns: 1fr; } + .card { padding: 24px; } + } \ No newline at end of file