/micro

A vanity image host with url shortening, 2fa, videos, and much more.

Primary LanguageTypeScriptGNU Affero General Public License v3.0AGPL-3.0


🔵 discord 🟣 hosted instance

micro

A vanity file sharing service with support for ShareX. You can see a preview at https://micro.sylo.digital

features

  • ShareX Support
  • Video and image thumbnails
  • Config generation
  • Encrypted pastes
  • File name preservation
  • Video, image, text and markdown previews
  • Syntax highlighting for supported files
  • Deletion URLs
  • Dashboard
  • Permissions
  • Invite links
  • URL Shortening
  • Mobile support
  • EXIF metadata removal
  • Conversions (GIF>WebM, WebP>PNG, etc.)
  • Purging of old and/or large files (config.purge).
  • 2FA support
  • Decay files to S3 to save space

screenshots

Sign In Page Dashboard
Upload Page Text Preview
Paste Page 2FA setup

installation

See the example directory for how to setup micro.

development

You can pull the repo and then pnpm install, after that everything should be good to go. You can start the packages/api/packages/web with pnpm watch.

web package notes

Important

tl;dr, web is quirky and some packages that depend on react may break. if they do, try adding them to noExternal in vite.config.ts and they'll probably work.

The web package is a little weird. It uses vike in place of what might normally be nextjs, preact in place of react and vite to build it all. Unlike nextjs, we have much more control over rendering, SSR, routing, etc. It's much faster, and much more fun. Of course, nothing is free - some hacky workarounds are required to get it working.

Preact is smaller, faster, and more fun than react. It's a drop-in replacement, but actually dropping it in is the hard part. The main problem is that in SSR mode, vite does not bundle dependencies, which means aliasing react to preact does not work because it's not transforming the packages to replace the react imports. You can force it to bundle dependencies, but then it chokes on some node dependencies like fastify. The only way I've found to get around this is to:

  • Alias react to preact in node_modules using .pnpmfile.cjs
  • Add some packages that still complain to noExternal in vite.config.ts, which forces them to be bundled and appears to resolve any remaining issues.

tsup is used as a final build step to bundle everything together. Vite breaks doing this, but not doing it results in much larger docker images.

todo

  • Ratelimiting
  • Admin UI
  • Deletion URLs for pastes/links
  • Password recovery via emails
  • SQLite support
  • Private email aliases like firefox relay (might be difficult/expensive)

support

sylo.digital