Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
641ef9c
Update README.md with Turkish translation
mehmetdemir-tr Apr 26, 2026
1673ce3
README.md Güncellemesi
mehmetdemir-tr Apr 26, 2026
4ebb916
Updated
mehmetdemir-tr Apr 26, 2026
7e403fd
Translate Next.js agent rules to Turkish
mehmetdemir-tr Apr 26, 2026
ad65d00
Translate .gitignore comments to Turkish
mehmetdemir-tr Apr 26, 2026
9aa1ab4
Update instructions in .env.example to Turkish
mehmetdemir-tr Apr 26, 2026
5105e7c
Translate comment to Turkish in file-tree-formatter
mehmetdemir-tr Apr 26, 2026
cb090dc
Translate comments in focus-fingerprint.ts to Turkish
mehmetdemir-tr Apr 26, 2026
fdfcd59
Update comment language in GitHub API client
mehmetdemir-tr Apr 26, 2026
52a009a
Translate comment to Turkish in home-example-repos.ts
mehmetdemir-tr Apr 26, 2026
681f787
Translate comments to Turkish
mehmetdemir-tr Apr 26, 2026
9d961f6
Translate Supabase client comment to Turkish
mehmetdemir-tr Apr 26, 2026
a2bf3a7
Translate system prompt to Turkish
mehmetdemir-tr Apr 26, 2026
7998656
Translate history page text to Turkish
mehmetdemir-tr Apr 26, 2026
4425078
Translate text to Turkish in library-page.tsx
mehmetdemir-tr Apr 26, 2026
0aaf5dc
Translate error messages and UI text to Turkish
mehmetdemir-tr Apr 26, 2026
a510008
Update description in metadata to Turkish
mehmetdemir-tr Apr 26, 2026
e3a3579
Update title and description to Turkish
mehmetdemir-tr Apr 26, 2026
923bc08
Translate metadata titles and descriptions to Turkish
mehmetdemir-tr Apr 26, 2026
8c112b4
Translate error message to Turkish
mehmetdemir-tr Apr 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Copy to .env.local and fill in values. See README for provider setup.
# .env.local'a kopyalayın ve değerleri doldurun. Daha Fazlası için README dosyasını okuyun..

# --- Supabase (optional: response caching is off if these are empty) ---
SUPABASE_URL=
Expand Down
14 changes: 7 additions & 7 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# Dosyaları yok sayma hakkında daha fazla bilgi için https://help.github.com/articles/ignoring-files/ adresini ziyaret edin.

# dependencies
# dependencies / bağımlılıklar
/node_modules
/.pnp
.pnp.*
Expand All @@ -10,27 +10,27 @@
!.yarn/releases
!.yarn/versions

# testing
# testing / Testler
/coverage

# next.js
/.next/
/out/

# production
# production / Yayınlama
/build

# misc
# misc / diğerleri
.DS_Store
*.pem

# debug
# debug / hata ayıklama
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
# env files (can opt-in for committing if needed) / env dosyaları (gerekirse commit işlemine dahil edilebilir)
.env*
!.env.example

Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<!-- BEGIN:nextjs-agent-rules -->
# This is NOT the Next.js you know
# Bu Next.js DEĞİL, Biliyorsun.

This version has breaking changesAPIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` before writing any code. Heed deprecation notices.
Bu Sürümde uyumsuz değişiklikler bulunmaktadırAPI'ler, kurallar ve dosya yapısı, eğitim verilerinizden farklı olabilir. Herhangi bir kod yazmadan önce `node_modules/next/dist/docs/` ilgili kılavuzu **okuyun.** Kullanımdan kaldırılacak özelliklere ilişkin uyarıları dikkate alın.
<!-- END:nextjs-agent-rules -->
54 changes: 33 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,46 +1,58 @@
# GitReverse
# GitReverse Turkish (Translated by mehmetdemir-tr)

https://github.com/user-attachments/assets/f0cdb7b2-c6f0-4483-8a01-153170479f2e

Turn a **public GitHub repository** into a **single synthetic user prompt** that someone might paste into Cursor, Claude Code, Codex, etc. to vibe code the project from scratch.
Bir **Geliştirilmeye açık GitHub deposunu** birisinin Cursor, Claude Code, Codex vb. uygulamalara yapıştırarak projeyi sıfırdan kodlayabileceği **tek sentetik yapay zeka istem satırına** dönüştürün.

The app pulls **repo metadata**, a **root file tree** (depth 1), and the **README**, then uses an LLM via [OpenRouter](https://openrouter.ai/) to produce one short, conversational prompt grounded in that context.
Bu uygulama, **repo meta verilerini**, bir **kök dosya ağacını** (derinlik yani depth 1) ve **README** dosyasını alır; ardından [OpenRouter](https://openrouter.ai/) aracılığıyla bir LLM kullanarak bu bağlamda temellendirilmiş kısa ve sohbet tarzında bir istem satırı oluşturur.

Paste a GitHub URL or `owner/repo` on the home page. You can also open **`/owner/repo`** (e.g. `/vercel/next.js`) for a shareable link that runs the same flow.
Ana sayfaya bir Github URL'si veya 'owner/repo' (sahip/depo) yazın. Aynı iş akışını çalıştıran paylaşılabilir bir bağlantı için **'/sahip/depo'** (ör. '/vercel/next.js) adresinide açabilirsiniz.

GitHub-style **`/owner/repo/tree/...`** URLs on this site **redirect to `/owner/repo`** so they do not 404. The reverse flow still uses the whole repo for now; **subfolder-aware** context (scoped to that path) is planned for a later change.
Bu sitedeki GitHub tarzı **'/owner/repo/tree/...'** URL'leri, 404 hatası vermemeleri için **`/owner/repo`** adresine yönlendirilir. Ters akış şimdilik hala tüm depoyu kullanmaktadır; **alt klasörleri algılayan** bağlam (o yolun kapsamına dahil) daha sonraki bir güncellemede eklenecektir.

## Stack
## Yığın (Stack)
Next.js (Uygulama Yönlendiricisi), React, TypeScript, Tailwind CSS, Github API Ve OpenRouter.

Next.js (App Router), React, TypeScript, Tailwind CSS, GitHub API, OpenRouter.
## Yapılandırma
`.env.example` dosyasını `.env.local` dosyasına kopyalayın. **`OPENROUTER_API_KEY`**'e ihtiyacınız var. İsteğe bağlı: `OPENROUTER_MODEL` (varsayılan olarak `google/gemini-2.5-pro`), daha iyi GitHub hız sınırları için `GITHUB_TOKEN` ve sunucu tarafında önbellekleme istiyorsanız örnek dosyadaki Supabase ortam değişkenleri.

## Configuration
### Özel ters yönlendirme (isteğe bağlı)

Copy `.env.example` to `.env.local`. You need **`OPENROUTER_API_KEY`**. Optional: `OPENROUTER_MODEL` (defaults to `google/gemini-2.5-pro`), `GITHUB_TOKEN` for better GitHub rate limits, and Supabase env vars from the example file if you want server-side caching.

### Custom reverse (optional)

For **deep / focus** prompts, run the **custom_reverse** service (separate TypeScript project; see its `README`; `pnpm dev`, default port **3001**) locally or deploy it to your own backend. In `.env.local` set:
**deep / focus** istemleri için, **custom_reverse** hizmetini (ayrı bir TypeScript projesi; `README` dosyasına bakın; `pnpm dev`, varsayılan bağlantı noktası **3001**) yerel olarak çalıştırın veya kendi arka ucunuza dağıtın. `.env.local` dosyasında şunu ayarlayın:



`CUSTOM_REVERSE_SERVICE_URL=http://localhost:3001`

Successful runs are stored in Supabase (`custom_prompt_cache`) when `SUPABASE_URL` and `SUPABASE_PUBLISHABLE_KEY` are set—they are **not** shown in the public library.

Then enable **Custom reverse** on the home page and describe what to reverse-engineer.

## Development
`SUPABASE_URL` ve `SUPABASE_PUBLISHABLE_KEY` ayarlandığında başarılı çalıştırmalar Supabase'de (`custom_prompt_cache`) saklanır; bunlar genel kütüphanede **görünmez**.



Ardından ana sayfada **Özel tersine çevirme** seçeneğini etkinleştirin ve neyin tersine mühendislik yapılacağını açıklayın.



## Geliştirme


```bash

pnpm install

pnpm dev

```

Open [http://localhost:3000](http://localhost:3000).

```bash
pnpm build
pnpm start
pnpm lint
```

Shout out to [GitIngest](http://github.com/coderamp-labs/gitingest) for inspiration.
[http://localhost:3000](http://localhost:3000) adresini açın.


[GitIngest](http://github.com/coderamp-labs/gitingest)'e fikir ve ilham için teşekkürler! :)

***Çeviri: mehmetdemir-tr (Mehmet Demir)***

2 changes: 1 addition & 1 deletion app/api/increment-views/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ if (
) {
throw new Error(
"[increment-views] VIEWS_IP_SALT is not set. " +
"Set a random secret (openssl rand -hex 32) in your deployment env."
"Deployment ortamında rastgele bir secret ayarlayın (openssl rand -hex 32)."
);
}

Expand Down
4 changes: 2 additions & 2 deletions app/history/page.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { HistoryPage } from "@/components/history-page";

export const metadata = {
title: "History — GitReverse",
description: "Repositories you recently viewed on GitReverse.",
title: "Geçmiş — GitReverse",
description: "GitReverse'de görüntülediğin Depoların geçmişini görüntüle.",
};

export default function HistoryRoute() {
Expand Down
2 changes: 1 addition & 1 deletion app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const geistMono = Geist_Mono({
export const metadata: Metadata = {
title: "GitReverse",
description:
"Turn a GitHub repository into a plain-language coding agent prompt.",
"Herhangi bir GitHub deposunu düz metin olarak hazırlanmış bir isteme dönüştürün.",
};

export default function RootLayout({
Expand Down
4 changes: 2 additions & 2 deletions app/library/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { LibraryPage } from "@/components/library-page";
export const dynamic = "force-dynamic";

export const metadata = {
title: "Prompt Library — GitReverse",
title: "Komut Kütüphanesi — GitReverse",
description:
"Browse 1,000+ reverse-engineered prompts from real GitHub repositories.",
"1,000+'den fazla oluşturulmuş komut kütüphanesini gezin.",
};

const INITIAL_LIMIT = 24;
Expand Down
30 changes: 15 additions & 15 deletions components/history-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ function isHistoryEntry(x: unknown): x is HistoryEntry {
const gt = (x as HistoryEntry).lastGenerationType;
if (
gt !== undefined &&
gt !== "quick" &&
gt !== "deep" &&
gt !== "manual"
gt !== "hızlı" &&
gt !== "derin" &&
gt !== "manuel"
) {
return false;
}
Expand All @@ -64,15 +64,15 @@ function isHistoryEntry(x: unknown): x is HistoryEntry {
function relativeTime(iso: string): string {
const diff = Date.now() - new Date(iso).getTime();
const s = Math.floor(diff / 1000);
if (s < 60) return "just now";
if (s < 60) return "Şimdi";
const m = Math.floor(s / 60);
if (m < 60) return `${m}m ago`;
if (m < 60) return `${m}dk önce`;
const h = Math.floor(m / 60);
if (h < 24) return `${h}h ago`;
if (h < 24) return `${h}saat önce`;
const d = Math.floor(h / 24);
if (d < 30) return `${d}d ago`;
if (d < 30) return `${d}gün önce`;
const mo = Math.floor(d / 30);
return `${mo}mo ago`;
return `${mo}ay önce`;
}

export function HistoryPage() {
Expand Down Expand Up @@ -138,20 +138,20 @@ export function HistoryPage() {
History
</h1>
<p className="text-zinc-600">
Your previously generated prompts.
Önceki oluşturduğunuz istemler.
</p>
</div>

{entries === null ? (
<p className="text-center text-zinc-500 sm:text-left">Loading&hellip;</p>
) : entries.length === 0 ? (
<p className="text-center text-zinc-600 sm:text-left">
No history yet. Check out the{" "}
Geçmiş yok (şimdilik) şuraya bir bak:{" "}
<Link
href="/library"
className="font-semibold text-zinc-900 underline decoration-zinc-900/30 underline-offset-2 transition-colors hover:decoration-zinc-900"
>
Prompt Library
istem Kütüphanesi
</Link>
.
</p>
Expand All @@ -172,19 +172,19 @@ export function HistoryPage() {
function generationBadge(entry: HistoryEntry): { label: string; title?: string } | null {
const t = entry.lastGenerationType;
if (t === "deep") {
return { label: "Deep", title: "Deep Reverse" };
return { label: "Derin", title: "Derin Tersine Mühendislik" };
}
if (t === "manual") {
const f = entry.lastManualFocus?.trim();
const short =
f && f.length > 48 ? `${f.slice(0, 48).trimEnd()}…` : f;
return {
label: short ? `Manual: ${short}` : "Manual",
title: f ?? "Manual control",
label: short ? `Manuel: ${short}` : "Manuel",
title: f ?? "Manuel Kontrol",
};
}
if (t === "quick") {
return { label: "Quick", title: "Quick reverse prompt" };
return { label: "Hızlı", title: "Hızlı tersine komut" };
}
return null;
}
Expand Down
32 changes: 16 additions & 16 deletions components/library-page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,25 +18,25 @@ type SortOption = "trending" | "newest" | "oldest";
const SORT_OPTIONS: SortOption[] = ["newest", "trending", "oldest"];

const SORT_LABELS: Record<SortOption, string> = {
trending: "Trending",
newest: "Newest first",
oldest: "Oldest first",
trending: "Popüler",
newest: "En yenisi",
oldest: "En eskisi",
};

const PAGE_SIZE = 24;

function relativeTime(iso: string): string {
const diff = Date.now() - new Date(iso).getTime();
const s = Math.floor(diff / 1000);
if (s < 60) return "just now";
if (s < 60) return "şimdi";
const m = Math.floor(s / 60);
if (m < 60) return `${m}m ago`;
if (m < 60) return `${m}dk önce`;
const h = Math.floor(m / 60);
if (h < 24) return `${h}h ago`;
if (h < 24) return `${h}saat önce`;
const d = Math.floor(h / 24);
if (d < 30) return `${d}d ago`;
if (d < 30) return `${d}gün önce`;
const mo = Math.floor(d / 30);
return `${mo}mo ago`;
return `${mo}ay önce`;
}

type LibraryPageProps = {
Expand Down Expand Up @@ -132,7 +132,7 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) {
href="/history"
className="font-semibold text-zinc-900 transition-transform hover:-translate-y-0.5"
>
History
Geçmiş
</Link>
<a
href="https://github.com/filiksyos/gitreverse"
Expand All @@ -158,10 +158,10 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) {
</div>
</div>
<h1 className="text-5xl font-extrabold tracking-tighter sm:text-6xl">
Prompt Library
İstem Kütüphanesi
</h1>
<p className="max-w-lg text-lg text-zinc-600">
Reverse-engineered prompts from real GitHub repositories.
Tersine Mühendislikle oluşturan orijinal GitHub depolarının istemleri.
</p>
</div>

Expand Down Expand Up @@ -275,8 +275,8 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) {
{entries.length === 0 ? (
<div className="flex flex-col items-center gap-3 py-24 text-center">
<span className="text-4xl">∅</span>
<p className="text-lg font-semibold text-zinc-700">No prompts found</p>
<p className="text-zinc-500">Try a different search term.</p>
<p className="text-lg font-semibold text-zinc-700">Karaya vurdun! (404)</p> {/* a little joke :D*/}
<p className="text-zinc-500">Aradığın istem bulunamadı, farklı bir şey arat.</p>
</div>
) : (
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-3">
Expand All @@ -286,7 +286,7 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) {
</div>
)}

{/* Load more */}
{/* Az daha yükle */}
{hasMore && (
<div className="flex justify-center pt-2">
<button
Expand Down Expand Up @@ -321,7 +321,7 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) {
Loading…
</>
) : (
<>Load {Math.min(PAGE_SIZE, total - entries.length)} more ↓</>
<>Daha fazlasını {Math.min(PAGE_SIZE, total - entries.length)} yükle ↓</>
)}
</button>
</div>
Expand All @@ -345,7 +345,7 @@ export function LibraryPage({ initialData, initialTotal }: LibraryPageProps) {
>
<path d="M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028 14.09 14.09 0 0 0 1.226-1.994.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418z" />
</svg>
Discord
Discord Sunucumuz
</a>
</div>
</footer>
Expand Down
Loading