View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
View osmancakir's full-sized avatar
🎯
Focusing
🎯
Focusing

Block or report osmancakir

Block user

Prevent this user from interacting with your repositories and sending you notifications. Learn more about blocking users.

You must be logged in to block users.

Content in all repositories owned by your account will be closed.
Maximum 250 characters. Please don’t include any personal information such as legal names or email addresses. Markdown is supported. This note will only be visible to you.
Report abuse

Contact GitHub support about this user’s behavior. Learn more about reporting abuse.

Report abuse
osmancakir/README.md

Osman Cakir

AI engineer in Munich. I build multi-agent systems and the products around them, which means I also write the frontend, the schema, the tests and the deploy pipeline. Most of my work sits where language models meet real collections: news, books, museum archives, research metadata.

Before software I studied economics and art history. That is why my agents tend to be evaluated rather than demoed.

Selected work

umbruchai-news-desk · LangGraph, TypeScript, OpenAI

A multi-agent newsroom that runs in production, and the backend of umbruchai.com. Five journalist personas research the day's stories in parallel and pitch; a human editor selects; the pipeline then writes each story at three CEFR levels of German, repairs its own schema and encoding errors through a validator agent, illustrates it, narrates it into three audio tracks, and publishes to a CMS. Parallel fan-out with state reducers, two human-in-the-loop interrupts, structured output captured through Zod-typed tools. Open source, including all seven agent definitions.

umbruchai · React Router 7, Cloudflare Workers, Sanity

The publication the news desk writes into: umbruchai.com, a German AI-journalism site now carrying 87 pieces across seven sections, each readable at three CEFR levels with audio at every level, and a page per agent author. Also open source, so the newsroom and the paper it prints can be read end to end.

candidgarden_web · React Router 7, pgvector, three.js, Cloudflare Workers (LMU Munich, with Prof. Dr. Kohle)

An institute for art re-search, now open source. Deployed at candidgarden.com, it holds 54,497 artworks from the ARTigo corpus, processed in three languages through hybrid human-AI verification, each read at Erwin Panofsky's three levels of meaning. The readings stay labelled provisional and confidence reports observed agreement rather than truth. Search embeds the query with bge-m3 and ranks it against 1,024-dimensional vectors in Postgres with pgvector, so a conceptual question finds work that shares no keyword with it.

The Atlas puts 89,800 of those readings into one WebGL point cloud. Its UMAP layout is fitted offline and never moves, so a search lights up matches inside a fixed space instead of rearranging it, and two searches stay comparable; a custom binary format ships the geometry in 1.6 MB rather than 8 MB of JSON. Server-rendered on Cloudflare Workers over Hyperdrive to a private RDS, with Vitest, Playwright and both runtimes built in CI.

ai-political-leanings · LLM evaluation, Python

Six frontier models answered the Political Compass's 59 propositions in English, German and Turkish: 1,062 answers, no refusals, no missing cells, scored on both axes. Five of six sit left-libertarian in every language, and the prompt language moves the result systematically, with German producing the most libertarian score for all six models.

Library Universe · React Router, TypeScript, Postgres, Sanity, fly.io

A library for reading and learning: a book catalogue and vocabulary flashcards on a spaced-repetition schedule. 249 commits, 225 TypeScript modules, Vitest and Playwright suites, GitHub Actions deploy. Source is private; the reading extension that pairs with it is not.

Städel Museum · multimodal LLM evaluation (freelance, 2026)

An AI metadata pipeline for artwork collections built on several multimodal models, with an evaluation workflow behind it: weighted scoring categories, blind comparison of model responses, and bias control conditions, plus a research interface for curators to review the output. The point was to find out which model an art-historical institution should actually trust, not to assume one.

agent-skills · Agent Skills for Claude Code and Codex

Installable skills, each with its own resources: a Bavarian public-sector job search that maintains a deduplicated database and scores ads against a candidate profile, and a cue-card generator that turns speaker notes into a printable duplex PDF deck.

DataCite Metadata Generator · React Router, TypeScript

A guided form that turns DataCite's deeply conditional kernel-4 schema into valid XML, with round-trip editing of records that already exist. Constraint-aware validation, so the repository stops rejecting submissions for reasons nobody can see. Live.

This is my own rebuild of a problem I worked on at LMU Munich, where I contributed 12 commits to the University Library's DataCite generator, which is in production at the UB.

What I work with

  • AI LangChain, LangGraph, RAG, pgvector, embeddings and UMAP projection, model evaluation, prompt and output-schema design, Claude Code, Codex
  • Frontend React, React Router, TypeScript, TanStack Query, Tailwind, Radix UI, Next.js, three.js and WebGL, TensorFlow.js
  • Backend Node.js, Postgres, SQLite and LiteFS, Python, Sanity, AWS S3 and RDS
  • Ops Docker, fly.io, Cloudflare Workers, AWS EC2 and CloudFront, GitHub Actions, Linux
  • Testing Vitest, Playwright, MSW, Sentry

Also

Five years of enterprise access-management dashboards at evolutionID GmbH, including a biometric photo capture module made roughly 50x faster by moving face detection into the browser with TensorFlow.js. DAAD scholarship, MSc Economics at LMU Munich.

Reachable at osmancakir11@gmail.com.

Pinned Loading

  1. umbruchai-news-deskumbruchai-news-deskPublic

    LangGraph multi-agent news desk: five AI journalist personas research, pitch, write, illustrate, narrate and publish graded German news articles. Production backend of umbruchai.com.

    TypeScript

  2. umbruchaiumbruchaiPublic

    Umbruch AI: a German AI-journalism publication where five agent personas write the newsroom. React Router 7 on Cloudflare Workers, Sanity CMS, graded reading levels and per-level audio.

    TypeScript

  3. rdm_datacite_newrdm_datacite_newPublic

    DataCite metadata generator: guided form to schema-valid kernel-4 XML, with round-trip editing. React Router 7, TypeScript, Zod. Built for research data management at LMU Munich.

    TypeScript

  4. agent-skillsagent-skillsPublic

    Installable Agent Skills for Claude Code and Codex: Bavarian public-sector job search with candidate-fit scoring, and printable cue-card decks from speaker notes.

    JavaScript

  5. libraryuniverse-reading-extensionlibraryuniverse-reading-extensionPublic

    Chrome MV3 extension that explains a word in the sentence you selected it from, and saves it to your reader. Contextual meaning first, then the other common ones.

    JavaScript

  6. ai-political-leaningsai-political-leaningsPublic

    Do language models have politics, and does the prompt language change them? Six frontier models answered the Political Compass in English, German and Turkish: 1,062 answers, no refusals, scored on …

    Jupyter Notebook