Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

utServer - The unoffical way to self host uploadthing, lightning fast

Running out of storage in uploadthing? Don't want to pay for more storage for testing? Then this is the perfect tool for you. All you need is bun and you have a quick uploadthing server, that works with the official client - out of the box, almost completely compat. We are fully compatiable with the openAPi spec.

How to run

The steps are easy, they are just a few things you have to do before you get started - these only need to be done once too

  1. Install bun
  2. Clone the repo and install deps
git clone https://github.com/brrock/utserver
cd utserver
bun i
  1. Copy .env.example to .env and edit the env variables, change the api key, base url, app id (this doesn't matter too much - just call it your app name) if you want and port if you want
  2. Generate uploadthing token, because uploadthing base64s it along some config it needs
bun bun genUtAPIKey.ts
  1. Add these to the app that uses uploadthing that you want to connect to your self hosted version - ensure you are running the latest uploadthing (this is very important, if you even want to try older versions, this requires uploadthing 7.7.3 - the core package )
UPLOADTHING_INGEST_URL="[yourbaseurl]"UPLOADTHING_API_URL="[yourbaseurl]"UPLOADTHING_UTFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_HOST="[yourbaseurlwithouthttporhttps]"UPLOADTHING_UFS_APP_ID_LOCATION=path# this is requiredUPLOADTHING_TOKEN={theoneyougeneratedinstep4}
  1. Init the DB - sqlite at the moment
bun prisma db:push
  1. Run the server
bun start
# running in debug 
DEBUG=1 bun start

FAQ

  • Is this allowed by UploadThing yes, it is an allowed, the maintainers have consented
  • What clients do this support Just the js one is confirmed to work, if you want your client to work make a PR or github issue

RoadMap

  • LTS version for multiple ut versions (maintainers wanted)
  • UploadThing tests
  • S3 storage adapter
  • Vercel blob storage adapter

About

The unofficial way to self host uploadthing. Fully compatiable with uploadthing. Written in hono for fast speeds

Resources

Stars

10 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages