A modern, elegant web application for creating and sharing collections of URLs through a single shareable link. Perfect for curating resources, sharing reading lists, or organizing links for projects and presentations.
- No Sign-up Required - Create and share bundles instantly without registration
- Custom Vanity URLs - Create memorable, branded links (e.g.,
yourdomain.com/my-resources) - Rich Link Previews - Automatically fetches titles, descriptions, favicons, and OG images
- Drag & Drop Reordering - Easily organize your links with smooth animations
- Dark/Light/System Theme - Beautiful interface that adapts to your preference
- Mobile Responsive - Works seamlessly on all devices
- Instant Publishing - Share your bundles with a single click
- Public Access - Published bundles are accessible to anyone with the link
- Multi-language Support - Built-in internationalization with 8 languages (English, Spanish, French, German, Portuguese, Japanese, Korean, Chinese)
- Remix Functionality - Easily remix existing bundles to create new ones
- Local Storage Persistence - Save your work-in-progress bundles locally
Visit thesharing.link to try it out! (Replace with actual deployment URL if available)
src/
βββ components/ # Reusable UI components
β βββ BundleSettings.tsx # Bundle configuration (vanity URL, description)
β βββ BundleViewer.tsx # View-only mode for shared bundles
β βββ Footer.tsx # Application footer
β βββ Header.tsx # Main navigation header with theme/language selectors
β βββ LanguageSelector.tsx # Language switcher component
β βββ LinkList.tsx # Draggable list of links with animations
β βββ PublishButton.tsx # Publishing functionality with animations
β βββ UrlInput.tsx # URL input with validation and metadata fetching
βββ contexts/ # React contexts
β βββ LanguageContext.tsx # Manages application language state
βββ hooks/ # Custom React hooks
β βββ useLocalStorage.ts # Persist data in localStorage
β βββ useTheme.ts # Theme management (light/dark/system)
β βββ useTranslation.ts # i18n hook for translations
βββ i18n/ # Internationalization
β βββ translations.ts # Translation strings for all supported languages
βββ lib/ # Third-party library configurations
β βββ database.types.ts # Supabase database types
β βββ supabase.ts # Supabase client configuration
βββ types/ # TypeScript type definitions
β βββ index.ts # Shared types (LinkItem, Bundle, Theme)
βββ utils/ # Utility functions
β βββ htmlUtils.ts # HTML entity decoding
β βββ urlUtils.ts # URL validation, normalization, metadata fetching, ID generation
βββ App.tsx # Main application component and state management
βββ index.css # Global CSS with Tailwind
βββ main.tsx # Application entry point
βββ vite-env.d.ts # Vite environment types
supabase/
βββ functions/ # Edge functions
β βββ fetch-metadata/ # Serverless function for URL metadata extraction
βββ ... # (Migrations and other Supabase configs not included in concat)
Other files:
βββ index.html # HTML entry with meta tags and theme/language scripts
βββ package.json # Dependencies and scripts
βββ postcss.config.js # PostCSS configuration
βββ README.md # This file
βββ tailwind.config.js # Tailwind CSS configuration
βββ tsconfig.app.json # TypeScript config for app
βββ tsconfig.json # Main TypeScript config
βββ tsconfig.node.json # TypeScript config for Node/Vite
-
Frontend:
- React 18 with TypeScript
- Vite 5.x (Build Tool)
- Tailwind CSS 3.x (Styling)
- Framer Motion (Animations and transitions)
- Lucide React (Icons)
- React Toastify (Notifications)
-
Backend:
- Supabase (Database, Edge Functions)
- PostgreSQL (Database via Supabase)
- Deno (For edge functions)
-
Development Tools:
- ESLint (Code Linting)
- TypeScript (Type Checking)
- NPM (Package Manager)
- Node.js 18+ (LTS recommended)
- Supabase account (for backend services)
-
Clone the repository
git clone https://github.com/yourusername/thesharing-link.git cd thesharing-link -
Install dependencies
npm install
-
Set up environment variables Create a
.envfile in the root directory with your Supabase credentials:VITE_SUPABASE_URL=your-supabase-url VITE_SUPABASE_ANON_KEY=your-supabase-anon-key
-
Start the development server
npm run dev
The app will be available at
http://localhost:5173 -
Build for production
npm run build
-
Lint the code
npm run lint
The application uses Supabase with the following tables:
id(uuid): Primary keyuser_id(uuid, nullable): For future authvanity_url(text, unique): Custom URL slugdescription(text): Bundle descriptionpublished(boolean): Publication statuscreated_at(timestamptz)updated_at(timestamptz)
id(uuid): Primary keybundle_id(uuid): Foreign key to bundlesurl(text): Link URLtitle(text)description(text)favicon(text)og_image(text, nullable)position(integer): Order in bundlecreated_at(timestamptz)
- App.tsx: Core logic for bundle management, viewing, and publishing
- BundleViewer.tsx: Renders public bundles with rich previews
- PublishButton.tsx: Handles publishing with animations and feedback
- UrlInput.tsx: Adds links with metadata fetching and validation
- LinkList.tsx: Draggable list with Framer Motion animations
- LanguageContext.tsx: Manages multi-language support
Supports 8 languages. Translations are in src/i18n/translations.ts. Browser language is auto-detected with localStorage persistence.
- Push to GitHub
- Import to Vercel/Netlify
- Set env vars:
VITE_SUPABASE_URL,VITE_SUPABASE_ANON_KEY - Deploy
- Create Supabase project
- Deploy edge function from
supabase/functions/fetch-metadata - Set up tables matching the schema above
- Enable Row Level Security (RLS) for public reads on published bundles
- Anonymous publishing (user_id nullable)
- Vanity URL validation and availability checks
- RLS for database security
- CORS headers in edge functions
- Input sanitization for URLs
- Fork the repo
- Create feature branch
- Commit changes
- Push and open PR
MIT License - see LICENSE for details.
Built with β€οΈ using React, TypeScript, Tailwind, Supabase, and Framer Motion. Special thanks to open-source contributors.