{"id":31956343,"url":"https://github.com/profullstack/links-aggregator","last_synced_at":"2025-10-14T14:50:01.820Z","repository":{"id":316535361,"uuid":"1063765112","full_name":"profullstack/links-aggregator","owner":"profullstack","description":"Aggregation of onion sites with random redirect button","archived":false,"fork":false,"pushed_at":"2025-09-25T07:17:06.000Z","size":144,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-09-25T07:23:01.554Z","etag":null,"topics":["links","tor"],"latest_commit_sha":null,"homepage":"http://rcbnqcp7hig2dusrmqfbemzoln7z4ikqfla4pcajzlkqynnoylesitqd.onion/","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/profullstack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-25T05:02:15.000Z","updated_at":"2025-09-25T07:17:09.000Z","dependencies_parsed_at":"2025-09-25T07:33:10.447Z","dependency_job_id":null,"html_url":"https://github.com/profullstack/links-aggregator","commit_stats":null,"previous_names":["profullstack/links-aggregator"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/profullstack/links-aggregator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flinks-aggregator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flinks-aggregator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flinks-aggregator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flinks-aggregator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/profullstack","download_url":"https://codeload.github.com/profullstack/links-aggregator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/profullstack%2Flinks-aggregator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279019140,"owners_count":26086685,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["links","tor"],"created_at":"2025-10-14T14:48:36.393Z","updated_at":"2025-10-14T14:50:01.815Z","avatar_url":"https://github.com/profullstack.png","language":"Svelte","readme":"# Links Aggregator\n\nA modern links aggregator built with SvelteKit 5, Skeleton UI, and Supabase, designed to run as a Tor hidden service on Railway.\n\n## Tech Stack\n\n- **Frontend**: SvelteKit 5 with Skeleton UI\n- **Backend**: Node.js 20+ with SvelteKit API routes\n- **Database**: Supabase (PostgreSQL)\n- **Styling**: Tailwind CSS with Skeleton UI components\n- **Testing**: Vitest\n- **Linting**: ESLint + Prettier\n- **Deployment**: Railway with Docker\n- **Privacy**: Tor hidden service support\n\n## Features\n\n- Modern, responsive UI with Skeleton components\n- Real-time database with Supabase\n- Docker containerization with Tor integration\n- Railway deployment ready\n- ESLint and Prettier configured\n- Vitest testing setup\n\n## Development Setup\n\n### Prerequisites\n\n- Node.js 20+\n- pnpm\n- Supabase CLI (optional, for local development)\n\n### Installation\n\n1. Clone the repository\n2. Install dependencies:\n   ```bash\n   pnpm install\n   ```\n\n3. Copy environment variables:\n   ```bash\n   cp .env.example .env\n   ```\n\n4. Update `.env` with your Supabase credentials:\n   ```env\n   # Client-side (PUBLIC_ prefix for browser exposure)\n   PUBLIC_SUPABASE_URL=your_supabase_project_url\n   PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key\n   \n   # Server-side (Private - no PUBLIC_ prefix)\n   SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key\n   SUPABASE_DB_PASSWORD=your_supabase_db_password\n   SUPABASE_JWT_SECRET=your_supabase_jwt_secret\n   ```\n\n### Development Commands\n\n```bash\n# Start development server (runs on http://localhost:8080)\npnpm dev\n\n# Build for production\npnpm build\n\n# Preview production build (runs on http://localhost:8080)\npnpm preview\n\n# Run tests\npnpm test\n\n# Run linting\npnpm lint\n\n# Format code\npnpm format\n```\n\n## Supabase Setup\n\n### Local Development\n\n1. Install Supabase CLI:\n   ```bash\n   pnpm add -g @supabase/cli\n   ```\n\n2. Start local Supabase:\n   ```bash\n   pnpx supabase start\n   ```\n\n3. Create new migration:\n   ```bash\n   pnpx supabase migrations new feature_name\n   ```\n\n### Production Setup\n\n1. Create a new Supabase project\n2. Link your local project to Supabase:\n   ```bash\n   pnpx supabase link\n   ```\n3. Update environment variables with your project credentials\n4. Push migrations to your Supabase project:\n   ```bash\n   pnpx supabase db push\n   ```\n\n## Docker \u0026 Tor Setup\n\n### Building the Docker Image\n\n```bash\ndocker build -t links-aggregator .\n```\n\n### Running with Tor\n\n```bash\ndocker run -p 8080:8080 links-aggregator\n```\n\nThe container will:\n- Start Tor with hidden service configuration\n- Display the `.onion` address in logs\n- Serve the application on port 8080\n\n## Railway Deployment\n\n### Option 1: Automatic Deployment\n1. Connect your repository to Railway\n2. Set environment variables in Railway dashboard:\n   - `PUBLIC_SUPABASE_URL`\n   - `PUBLIC_SUPABASE_ANON_KEY`\n   - `SUPABASE_SERVICE_ROLE_KEY`\n   - `SUPABASE_DB_PASSWORD`\n   - `SUPABASE_JWT_SECRET`\n\n   **Note**: These environment variables are required during both build and runtime for the Docker container.\n3. Deploy using the included `railway.toml` configuration\n\n### Option 2: Manual Volume Setup (Required for Persistent Tor Keys)\n1. Deploy your project to Railway first\n2. **Right-click on your service card** in Railway dashboard\n3. **Select \"Add Volume\"**\n4. **Mount Path**: `/var/lib/tor` (only field needed)\n5. **Save** the volume\n6. **Redeploy** to activate the volume\n\n**Alternative**: Run the setup script for guidance: `bash scripts/setup-railway.sh`\n\n**Note**: The volume ensures your `.onion` address stays the same across deployments.\n\nThe deployment will automatically:\n- Build using the Dockerfile\n- Configure Tor hidden service with persistent volume for keys\n- Start the application\n\n### Volume Configuration\n\nThe Railway deployment includes a persistent volume (`tor-keys`) mounted at `/var/lib/tor` to preserve Tor hidden service keys between deployments. This ensures your `.onion` address remains consistent across redeploys.\n\n**Volume Details (railway.toml):**\n```toml\n[[deploy.volumes]]\nname = \"tor-keys\"\nmountPath = \"/var/lib/tor\"\n```\n\n**Purpose**: Persist Tor hidden service private keys and hostname across deployments\n\n## Project Structure\n\n```\n├── src/\n│   ├── lib/\n│   │   └── supabase.js          # Supabase client\n│   ├── routes/\n│   │   ├── +layout.svelte       # Main layout\n│   │   └── +page.svelte         # Home page\n│   ├── app.html                 # HTML template\n│   └── app.css                  # Global styles\n├── tests/                       # Test files\n├── docker/                      # Docker configuration\n├── supabase/                    # Supabase configuration\n├── package.json\n├── svelte.config.js\n├── vite.config.js\n├── tailwind.config.js\n└── Dockerfile\n```\n\n## Contributing\n\n1. Follow the established code style (ESLint + Prettier)\n2. Write tests for new features\n3. Update documentation as needed\n4. Create meaningful commit messages\n\n## License\n\nMIT License","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprofullstack%2Flinks-aggregator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprofullstack%2Flinks-aggregator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprofullstack%2Flinks-aggregator/lists"}