๐ฆ
Embedded, not external
`npm install @jeffjassky/shorty`, mount the routers, done. Your users stay signed in to your app โ no redirect to a third-party service, no SSO handshake, no data leaving your database.
Self-hosted short links for Express + MongoDB: UTM builder, click analytics, React admin UI
import mongoose from 'mongoose';
import express from 'express';
import { createShorty } from '@jeffjassky/shorty';
await mongoose.connect(process.env.MONGO_URL);
const pkg = createShorty({
connection: mongoose,
resolveUser: (req) => req.session.user && {
id: req.session.user._id,
email: req.session.user.email,
displayName: req.session.user.name,
isAdmin: req.session.user.role === 'admin',
},
});
const app = express();
app.use(express.json());
// Public
app.use('/api/shorty', requireAuth, pkg.routes);
app.use('/shorty', requireAuth, pkg.ui({ mountPath: '/shorty' }));
// Admin โ separate guard, separate route
app.use('/api/shorty/admin', requireAuth, requireAdmin, pkg.adminRoutes);
app.use('/admin/shorty', requireAuth, requireAdmin,
pkg.adminUi({ mountPath: '/admin/shorty' }));