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
shortlinks
with 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
users
table in Supabase - Add the following row-level security policies to your
shortlinks
table (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
url
incomposables/useExternalRedirect.ts
to whatever you want default redirect to be (e.g.https://yumiizumi.com
) - Change
redirectTo
option inpages/dashboard.vue
to<your-domain>/dashboard
(e.g.https://yumi.to/dashboard
) - Change the
pages/blog
directory to whatever you want for specific directory name shortlinks (e.g.pages/blog
->pages/abc
to 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_HASH
in 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.