{"id":50765525,"url":"https://github.com/ruwiss/peertest","last_synced_at":"2026-06-11T13:30:46.693Z","repository":{"id":362968782,"uuid":"1261443406","full_name":"ruwiss/peertest","owner":"ruwiss","description":"Peer testing platform helping Android devs meet Google Play's 14-day, 12-tester closed test requirement.","archived":false,"fork":false,"pushed_at":"2026-06-06T18:33:21.000Z","size":296,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-06T20:14:57.147Z","etag":null,"topics":["google-play","google-play-store","play-store","test","testing"],"latest_commit_sha":null,"homepage":"https://peertest.live/","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruwiss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2026-06-06T17:34:03.000Z","updated_at":"2026-06-06T18:33:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ruwiss/peertest","commit_stats":null,"previous_names":["ruwiss/peertest"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ruwiss/peertest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruwiss%2Fpeertest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruwiss%2Fpeertest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruwiss%2Fpeertest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruwiss%2Fpeertest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruwiss","download_url":"https://codeload.github.com/ruwiss/peertest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruwiss%2Fpeertest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34201839,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"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":["google-play","google-play-store","play-store","test","testing"],"created_at":"2026-06-11T13:30:43.866Z","updated_at":"2026-06-11T13:30:46.662Z","avatar_url":"https://github.com/ruwiss.png","language":"Svelte","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PeerTest\n\n\u003e Geliştiriciler için **peer testing platformu**. Google Play Store'un kapalı test sürecindeki \"14 gün boyunca 12 aktif test kullanıcısı\" şartını aşmak için karşılıklı yardımlaşma sistemi.\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)\n[![SvelteKit](https://img.shields.io/badge/SvelteKit-2.x-FF3E00?logo=svelte)](https://kit.svelte.dev/)\n[![Postgres](https://img.shields.io/badge/Postgres-Neon-336791?logo=postgresql)](https://neon.tech/)\n\n## Nasıl çalışır\n\nBir tester, bir uygulamaya **14 günlük taahhüt** verir; üç checkpoint'te (Katıldım, Aktifim, Tamamladım) ekran görüntüsü kanıtı yükler. Kaçırırsa **kendi uygulamalarının slotları geçici olarak donar** (frozen). Disiplin tamamen bu donma mekanizmasıyla sağlanır.\n\nİki katılım modu:\n\n- **Karşılıklı (Trade)** — Sen onun uygulamasını, o seninkini test eder. İki taraf da aynı çifti seçince eşleşir, iki taahhüt birden başlar.\n- **Karşılıksız (Free)** — Karşılık beklemeden test edersin.\n\n## Teknoloji\n\n- **SvelteKit 2** (Svelte 5 runes) + **Tailwind CSS v4**\n- **Neon Postgres** + **Drizzle ORM**\n- **Telegram Bot API** — bot deep-link login + DM bildirimleri\n- **Vercel Cron** — günlük checkpoint kontrolü\n- **paraglide-js** — TR/EN\n- Ekran görüntüsü upload: prntscr / imgbb / imgur / catbox / freeimage / 0x0.st / Vercel Blob (admin panelden seçilir)\n\nMimari detayı için: [`plan.md`](plan.md)\n\n## Hızlı Başlangıç\n\n```bash\ngit clone \u003crepo\u003e\ncd peertest-playstore\nnpm install\ncp .env.example .env   # değerleri doldur (aşağı bak)\nnpm run db:migrate     # tabloları Postgres'e oluştur\nnpm run dev\n```\n\nTarayıcı: \u003chttp://localhost:5173\u003e\n\n## Ortam Değişkenleri\n\n`.env.example`'i `.env` olarak kopyalayıp doldur. Hiçbir gerçek değeri repo'ya commit etme; `.env` zaten `.gitignore`'da.\n\n| Değişken | Zorunlu | Açıklama |\n| --- | --- | --- |\n| `DATABASE_URL` | ✅ | Postgres connection string (Neon önerilir, pooled `-pooler` host kullan) |\n| `TELEGRAM_BOT_TOKEN` | ✅ | [@BotFather](https://t.me/BotFather)'dan bot token |\n| `PUBLIC_TELEGRAM_BOT_USERNAME` | ✅ | Bot kullanıcı adı (`@` olmadan) |\n| `TELEGRAM_WEBHOOK_SECRET` | ✅ | Webhook doğrulama gizli anahtarı (`openssl rand -hex 32`) |\n| `ADMIN_TELEGRAM_IDS` | ✅ | İlk admin(ler)in Telegram sayısal ID'leri (virgülle ayrık) |\n| `PUBLIC_BASE_URL` | ✅ | Canlı origin (`https://...`). Dev'de `http://localhost:5173` |\n| `UPLOAD_SECRET_KEY` | ⚠️ | Seçtiğin upload provider'ın API key'i |\n| `CRON_SECRET` | ✅ | Vercel Cron endpoint koruması (`openssl rand -base64 32`) |\n| `DEV_LOGIN` | ⛔ | **Sadece yerel.** `true` ise `/api/auth/dev-login` açılır. **Üretimde boş bırak** |\n\n## Telegram Bot Kurulumu\n\n1. [@BotFather](https://t.me/BotFather) → `/newbot` → token al → `TELEGRAM_BOT_TOKEN`'a yaz\n2. Bot username'ini `PUBLIC_TELEGRAM_BOT_USERNAME`'a yaz\n3. Deploy sonrası webhook bağla:\n   ```bash\n   curl \"https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/setWebhook?url=https://your-domain/api/telegram/webhook\u0026secret_token=$TELEGRAM_WEBHOOK_SECRET\"\n   ```\n\nLogin akışı **Telegram Login Widget değil, bot deep-link**: kullanıcı `t.me/BOT?start=login_\u003ctoken\u003e`'a yönlendirilir, Start basar, bot geri \"Oturumu aç\" butonu döner. `/setdomain` ayarı gerekli değil.\n\n## Admin Kurulumu\n\n1. Kendi Telegram sayısal ID'ni `ADMIN_TELEGRAM_IDS`'e ekle (ID için: [@userinfobot](https://t.me/userinfobot))\n2. Siteden Telegram ile giriş yap (otomatik admin olursun)\n3. Varsayılan ayar/şablonları yükle: admin panelinden ya da `POST /api/admin/seed`\n4. `/admin/settings` ve `/admin/templates` üzerinden parametre yönetimi\n\n## Veritabanı\n\n```bash\nnpm run db:generate   # şema değişince migration üret\nnpm run db:migrate    # migration'ları uygula (non-interactive)\nnpm run db:push       # interactive push (drizzle-kit)\nnpm run db:studio     # Drizzle Studio\n```\n\n## Vercel'e Deploy\n\n1. Projeyi Vercel'e bağla (`@sveltejs/adapter-vercel` yapılandırılmış)\n2. Tüm ortam değişkenlerini Vercel proje ayarlarına ekle (`DEV_LOGIN` HARİÇ)\n3. Migration'ları prod DB'ye uygula:\n   ```bash\n   DATABASE_URL=\"\u003cprod-url\u003e\" npm run db:migrate\n   ```\n4. Deploy et. [`vercel.json`](vercel.json) cron'u her gün 06:00 UTC `/api/cron`'u tetikler\n\n### Üretim Kontrol Listesi\n\n- [ ] `DEV_LOGIN` boş\n- [ ] `ADMIN_TELEGRAM_IDS` doğru\n- [ ] Tüm gizli değerler Vercel env'de\n- [ ] `db:migrate` prod'da koşuldu\n- [ ] Telegram `setWebhook` (secret_token ile) yapıldı\n- [ ] `PUBLIC_BASE_URL` canlı domain\n- [ ] `/api/admin/seed` çağrıldı\n\n## Komutlar\n\n| Komut | Açıklama |\n| --- | --- |\n| `npm run dev` | Geliştirme sunucusu |\n| `npm run build` | Üretim derlemesi |\n| `npm run check` | Tip kontrolü (svelte-check) |\n| `npm run lint` / `format` | Prettier + ESLint |\n| `npm run db:migrate` | DB migration |\n\n## Mimari\n\n- **`src/lib/server/`** — DB, auth, bot, trade, notification, upload, score, security helper'ları\n- **`src/routes/`** — Sayfalar (`(app)` grubu giriş ister, `(admin)` ek olarak admin rolü ister)\n- **`src/routes/api/`** — REST endpoint'leri (commitments, upload, telegram webhook, bot-login start/complete)\n- **`drizzle/`** — Migration'lar (sema değişikliklerinde commit'le)\n- **`messages/{tr,en}.json`** — paraglide kaynak mesajlar\n\n## Katkı\n\nIssue ve PR'ler memnuniyetle kabul edilir. Önce büyük değişiklikler için bir issue aç; sonra:\n\n```bash\nnpm run check \u0026\u0026 npm run lint\n```\n\n## Lisans\n\nMIT — bkz. [LICENSE](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruwiss%2Fpeertest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruwiss%2Fpeertest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruwiss%2Fpeertest/lists"}