Your personal URL shortener built with Nuxt, Supabase, Vercel, and TailwindCSS.
- 100% free (can be hosted at completely free with Vercel, Supabase, and GitHub) and open-source
- Create shortlinks via dashboard or an API call
- Shortlinks can be manually created or automatically generated
- Use your own domain name
- Authentication with GitHub or API key
- Support for various short-link dictionary
- From Supabase Database
- From JSON-based dictionary
- Preconfigured iOS Shortcuts
There is no requirement to use this project, but the following are recommended:
- Domain name (e.g.
yumi.to)
- Create a new Supabase project
- Add a new table called
shortlinkswith the following columns:id(type:uuid, primary key)created_at(type:timestamptz, default:now())short(type:text, unique)link(type:text)expire(type:timestamptz, default:NULL)
or you can use the following SQL query:
create table public.shortlinks (
id uuid not null default gen_random_uuid (),
created_at timestamp with time zone not null default now(),
short text not null default ''::text,
link text not null default ''::text,
expire timestamp with time zone null,
constraint shortlinks_pkey primary key (id),
constraint shortlinks_short_key unique (short)
)- Fork this repository
- Create a new Vercel project
- Add the following environment variables:
SUPABASE_URL(your Supabase URL e.g.https://<your-project>.supabase.co)SUPABASE_KEY(your Supabase public anon key)BASE_URL(your domain name e.g.https://yumi.to)
- Follow the instructions here to set up your custom domain.
By default, this project uses GitHub as the authentication provider. You can
change this by editing pages/dashboard.vue and Supabase authentication
provider settings.
To continue with GitHub, follow the instructions here
After setting up authentication, you can add row-level security to your Supabase table to prevent unauthorized users from modifying your shortlinks.
- Create an account for yourself in the dashboard of your fork of this project
(e.g.
https://yumi.to/dashboard) - Copy your user ID from the
userstable in Supabase - Add the following row-level security policies to your
shortlinkstable (replace<your-user-id>with your user ID from step 2):
-- Allow anyone to read shortlinks
create policy "Allow anyone to read shortlinks" on public.shortlinks for select using (true);
-- Allow yourself to create shortlinks
create policy "Allow yourself to create shortlinks" on public.shortlinks for insert with check (auth.uid() = '<your-user-id>');
-- Allow yourself to update shortlinks
create policy "Allow yourself to update shortlinks" on public.shortlinks for update using (auth.uid() = '<your-user-id>') with check (auth.uid() = '<your-user-id>');
-- Allow yourself to delete shortlinks
create policy "Allow yourself to delete shortlinks" on public.shortlinks for delete using (auth.uid() = '<your-user-id>');- Go into Auth Settings in Project Settings on Supabase dashboard to disable new user signups.
In Supabase SQL Editor, run the following query to set up a cron job to delete expired shortlinks every week on Sunday at 02:00 (for customizing cron, see crontab.guru):
select cron.schedule(
'weekly-cleanup-of-expired-shortlinks',
'0 2 * * 0', -- At 02:00 on Sunday.
$$ delete from shortlinks where expire < now() - interval '1 week' $$
)- Change
urlincomposables/useExternalRedirect.tsto whatever you want default redirect to be (e.g.https://yumiizumi.com) - Change
redirectTooption inpages/dashboard.vueto<your-domain>/dashboard(e.g.https://yumi.to/dashboard) - Change the
pages/blogdirectory to whatever you want for specific directory name shortlinks (e.g.pages/blog->pages/abcto support links likeyumi.to/abc/xyz) - This project uses TailwindCSS for styling, so you can customize the styles by editing the component classes
You can use this project with iOS Shortcuts to create a custom URL shortener. To do this, you can use the following shortcut:
- Create an API key
- Create a random string as the API key
- Take the MD5 hash of the API key
- Store the MD5 hash of the API key as
API_KEY_HASHin your Supabase Edge Function Secrets Management settings
- Get the iOS shortcut here
- First time you run the shortcut, you will be prompted to enter your domain
name (e.g.
yumi.to) and the API key you created in step 1 - You are now ready to use the shortcut!
This project is licensed under the MIT License - see the LICENSE file for details.
