Show HN: FileKitty – Combine and label text files for LLM prompt contexts

https://github.com/banagale/FileKitty

FileKitty Homebrew

A macOS utility for selecting, combining, and copying the contents of files — ideal for use with LLMs and generative AI tools. FileKitty lets you grab context from multiple files with one click and keeps a full history of your selections.


Use Cases

  • Gather code snippets for LLM prompts (ChatGPT, Claude, Gemini, Copilot, etc.)
  • Provide precise multi-file context for generative AI tools
  • Combine logs, configs, or structured docs for inspection
  • Track and revisit prior file selections and outputs

Quick Install (macOS via Homebrew)

brew install banagale/filekitty/filekitty

Launch the App

  • From Terminal:
  • Or via Finder:
    open /opt/homebrew/opt/filekitty/FileKitty.app

Make it a Regular Mac App

To access via Spotlight or Launchpad, copy the app to /Applications:

ditto /opt/homebrew/opt/filekitty/FileKitty.app /Applications/FileKitty.app

Note: Using ditto rather than cp preserves the application bundle's icon and metadata.


Manual Build (Alternative)

Install Poetry and build locally:

git clone https://github.com/banagale/FileKitty.git
cd FileKitty
poetry install
poetry run python setup.py py2app

The app will be created in ./dist/. Copy it to /Applications for full integration.

Manual builds are useful for development or Linux/Windows adaptation.


Screenshots

Select files, preview combined output, copy instantly


How to Use

  1. Open the app
  2. Select Files or drag-and-drop files from Finder, PyCharm, etc.
  3. Combined contents will appear, grouped in Markdown code blocks.
  4. Click Copy to Clipboard and paste into your LLM or chat.

History Navigation

  • Back/Forward buttons let you navigate prior selections
  • Changes to file contents are detected and marked as (Modified) or (Missing Files)

Python Symbol Mode

  • When .py files are selected, use Select Classes/Functions to target specific symbols and relevant imports.

Refreshing

  • Click Refresh to reload the current selection, useful after editing source files.

Preferences

Access via FileKitty → Preferences (Cmd+,):

  • Default Select Directory – sets initial folder for file dialog
  • History Location – controls where snapshot state is stored

Developer & Contributor Guide

Manual Build

(Also listed above.)

git clone https://github.com/banagale/FileKitty.git
cd FileKitty
poetry install
poetry run python setup.py py2app

The app bundle will be created in ./dist/.


Linting & Formatting

Uses Ruff:

make lint      # Run linter
make format    # Format code
# or directly
poetry run ruff check .
poetry run ruff format .

Pre-commit Hooks

Set up local linting before commits:

pre-commit install
pre-commit run --all-files

Continuous Integration

  • GitHub Actions validate linting and build on every push
  • See .github/workflows/ for full pipeline

License

MIT License © Rob Banagale

{
"by": "bredren",
"descendants": 21,
"id": 40226976,
"kids": [
40230373,
40231132,
40232792,
40235036,
40253694,
40231422,
40230233,
40230855,
40226992
],
"score": 69,
"time": 1714587003,
"title": "Show HN: FileKitty – Combine and label text files for LLM prompt contexts",
"type": "story",
"url": "https://github.com/banagale/FileKitty"
}
{
"author": "banagale",
"date": null,
"description": "GUI for selecting text files for concatenation and submission to LLMs - banagale/FileKitty",
"image": "https://opengraph.githubassets.com/b32b8dd538069ed133e3d88a2d782c87fb94484cac9d26e4469c22007b91aef6/banagale/FileKitty",
"logo": "https://logo.clearbit.com/github.com",
"publisher": "GitHub",
"title": "GitHub - banagale/FileKitty: GUI for selecting text files for concatenation and submission to LLMs",
"url": "https://github.com/banagale/FileKitty"
}
{
"url": "https://github.com/banagale/FileKitty",
"title": "GitHub - banagale/FileKitty: GUI for selecting text files for concatenation and submission to LLMs",
"description": "FileKitty A macOS utility for selecting, combining, and copying the contents of files — ideal for use with LLMs and generative AI tools. FileKitty lets you grab context from multiple files with one click...",
"links": [
"https://github.com/banagale/FileKitty"
],
"image": "https://opengraph.githubassets.com/b32b8dd538069ed133e3d88a2d782c87fb94484cac9d26e4469c22007b91aef6/banagale/FileKitty",
"content": "<div><article><div><h2>FileKitty <a target=\"_blank\" href=\"https://github.com/banagale/homebrew-filekitty\"><img src=\"https://camo.githubusercontent.com/df7ae05690f131a490997a7fa0499adfc87300486059ddcb3b1a24fffd2709df/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f627265772d696e7374616c6c2d677265656e\" alt=\"Homebrew\" /></a></h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#filekitty-\"></a></div>\n<a target=\"_blank\" href=\"https://private-user-images.githubusercontent.com/1409710/327196008-d7c68e71-5245-499b-8be9-3ca1f88adc1b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDU1MjUyODAsIm5iZiI6MTc0NTUyNDk4MCwicGF0aCI6Ii8xNDA5NzEwLzMyNzE5NjAwOC1kN2M2OGU3MS01MjQ1LTQ5OWItOGJlOS0zY2ExZjg4YWRjMWIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDQyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA0MjRUMjAwMzAwWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZWY5ZDc3N2YyNDNlZjFlYjM1Y2U5YzQzMzk3OGM2NGY0YjBlNmU3NzNiYmRhMGY3OWI5NGQ4NWI3NDEzZDVmNyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.LvMk3_qloDj29OElqtG8qcQbD4FhbEVJEgo81lGhPJM\"><img src=\"https://private-user-images.githubusercontent.com/1409710/327196008-d7c68e71-5245-499b-8be9-3ca1f88adc1b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDU1MjUyODAsIm5iZiI6MTc0NTUyNDk4MCwicGF0aCI6Ii8xNDA5NzEwLzMyNzE5NjAwOC1kN2M2OGU3MS01MjQ1LTQ5OWItOGJlOS0zY2ExZjg4YWRjMWIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDQyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA0MjRUMjAwMzAwWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9ZWY5ZDc3N2YyNDNlZjFlYjM1Y2U5YzQzMzk3OGM2NGY0YjBlNmU3NzNiYmRhMGY3OWI5NGQ4NWI3NDEzZDVmNyZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.LvMk3_qloDj29OElqtG8qcQbD4FhbEVJEgo81lGhPJM\" /></a>\n<p>A macOS utility for selecting, combining, and copying the contents of files — ideal for use with <strong>LLMs and generative AI tools</strong>. FileKitty lets you grab context from multiple files with one click and keeps a full history of your selections.</p>\n<hr />\n<p></p><h2>Use Cases</h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#use-cases\"></a><p></p>\n<ul>\n<li>Gather code snippets for LLM prompts (ChatGPT, Claude, Gemini, Copilot, etc.)</li>\n<li>Provide precise multi-file context for generative AI tools</li>\n<li>Combine logs, configs, or structured docs for inspection</li>\n<li>Track and revisit prior file selections and outputs</li>\n</ul>\n<hr />\n<p></p><h2>Quick Install (macOS via Homebrew)</h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#quick-install-macos-via-homebrew\"></a><p></p>\n<div><pre>brew install banagale/filekitty/filekitty</pre></div>\n<p></p><h3>Launch the App</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#launch-the-app\"></a><p></p>\n<ul>\n<li>From Terminal:\n</li>\n<li>Or via Finder:\n<div><pre>open /opt/homebrew/opt/filekitty/FileKitty.app</pre></div>\n</li>\n</ul>\n<p></p><h3>Make it a Regular Mac App</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#make-it-a-regular-mac-app\"></a><p></p>\n<p>To access via Spotlight or Launchpad, copy the app to <code>/Applications</code>:</p>\n<div><pre>ditto /opt/homebrew/opt/filekitty/FileKitty.app /Applications/FileKitty.app</pre></div>\n<p><strong>Note:</strong> Using <code>ditto</code> rather than <code>cp</code> preserves the application bundle's icon and metadata.</p>\n<hr />\n<p></p><h2>Manual Build (Alternative)</h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#manual-build-alternative\"></a><p></p>\n<p>Install <a target=\"_blank\" href=\"https://python-poetry.org/\">Poetry</a> and build locally:</p>\n<div><pre>git clone https://github.com/banagale/FileKitty.git\n<span>cd</span> FileKitty\npoetry install\npoetry run python setup.py py2app</pre></div>\n<p>The app will be created in <code>./dist/</code>. Copy it to <code>/Applications</code> for full integration.</p>\n<p>Manual builds are useful for development or Linux/Windows adaptation.</p>\n<hr />\n<p></p><h2>Screenshots</h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#screenshots\"></a><p></p>\n<p><em>Select files, preview combined output, copy instantly</em></p>\n<a target=\"_blank\" href=\"https://private-user-images.githubusercontent.com/1409710/354033702-5596d32e-52b3-4791-90eb-32ba0def3162.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDU1MjUyODAsIm5iZiI6MTc0NTUyNDk4MCwicGF0aCI6Ii8xNDA5NzEwLzM1NDAzMzcwMi01NTk2ZDMyZS01MmIzLTQ3OTEtOTBlYi0zMmJhMGRlZjMxNjIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDQyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA0MjRUMjAwMzAwWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NzE1OWQ1NjVhNGU4MDEwZmZjMDQ5ZmE3OWJhMGFlNjM4YzMzYWU2YTVmMThlNWU0MWY3OTIyMzJjYjBlMWU2OSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.uq2zqDrNrapS60DBXpecFO60RZGNQrHoeeRtWVDuEeA\"><img src=\"https://private-user-images.githubusercontent.com/1409710/354033702-5596d32e-52b3-4791-90eb-32ba0def3162.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDU1MjUyODAsIm5iZiI6MTc0NTUyNDk4MCwicGF0aCI6Ii8xNDA5NzEwLzM1NDAzMzcwMi01NTk2ZDMyZS01MmIzLTQ3OTEtOTBlYi0zMmJhMGRlZjMxNjIucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDQyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA0MjRUMjAwMzAwWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9NzE1OWQ1NjVhNGU4MDEwZmZjMDQ5ZmE3OWJhMGFlNjM4YzMzYWU2YTVmMThlNWU0MWY3OTIyMzJjYjBlMWU2OSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.uq2zqDrNrapS60DBXpecFO60RZGNQrHoeeRtWVDuEeA\" /></a>\n<a target=\"_blank\" href=\"https://private-user-images.githubusercontent.com/1409710/432898281-b95a981e-673d-4df1-ad2f-cb92cd3fc416.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDU1MjUyODAsIm5iZiI6MTc0NTUyNDk4MCwicGF0aCI6Ii8xNDA5NzEwLzQzMjg5ODI4MS1iOTVhOTgxZS02NzNkLTRkZjEtYWQyZi1jYjkyY2QzZmM0MTYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDQyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA0MjRUMjAwMzAwWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9N2M4MzU4OWYxM2Q5MWU0YTIwNjM3NTQzMDMwZjlmNjMxN2ViMWY3OTM4OWQzYTNhMDhiOGQ0YmUzMTZkNDE2MSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.2JTgug028PpQz1BloBI82w5OHLOIDtf1Gx70iPfnHso\"><img src=\"https://private-user-images.githubusercontent.com/1409710/432898281-b95a981e-673d-4df1-ad2f-cb92cd3fc416.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDU1MjUyODAsIm5iZiI6MTc0NTUyNDk4MCwicGF0aCI6Ii8xNDA5NzEwLzQzMjg5ODI4MS1iOTVhOTgxZS02NzNkLTRkZjEtYWQyZi1jYjkyY2QzZmM0MTYucG5nP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI1MDQyNCUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA0MjRUMjAwMzAwWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9N2M4MzU4OWYxM2Q5MWU0YTIwNjM3NTQzMDMwZjlmNjMxN2ViMWY3OTM4OWQzYTNhMDhiOGQ0YmUzMTZkNDE2MSZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.2JTgug028PpQz1BloBI82w5OHLOIDtf1Gx70iPfnHso\" /></a>\n<hr />\n<p></p><h2>How to Use</h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#how-to-use\"></a><p></p>\n<ol>\n<li><strong>Open the app</strong></li>\n<li><strong>Select Files</strong> or drag-and-drop files from Finder, PyCharm, etc.</li>\n<li>Combined contents will appear, grouped in Markdown code blocks.</li>\n<li>Click <strong>Copy to Clipboard</strong> and paste into your LLM or chat.</li>\n</ol>\n<p></p><h3>History Navigation</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#history-navigation\"></a><p></p>\n<ul>\n<li>Back/Forward buttons let you navigate prior selections</li>\n<li>Changes to file contents are detected and marked as <code>(Modified)</code> or <code>(Missing Files)</code></li>\n</ul>\n<p></p><h3>Python Symbol Mode</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#python-symbol-mode\"></a><p></p>\n<ul>\n<li>When <code>.py</code> files are selected, use <strong>Select Classes/Functions</strong> to target specific symbols and relevant imports.</li>\n</ul>\n<p></p><h3>Refreshing</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#refreshing\"></a><p></p>\n<ul>\n<li>Click <strong>Refresh</strong> to reload the current selection, useful after editing source files.</li>\n</ul>\n<p></p><h3>Preferences</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#preferences\"></a><p></p>\n<p>Access via <strong>FileKitty → Preferences</strong> (<code>Cmd+,</code>):</p>\n<ul>\n<li><strong>Default Select Directory</strong> – sets initial folder for file dialog</li>\n<li><strong>History Location</strong> – controls where snapshot state is stored</li>\n</ul>\n<hr />\n<p></p><h2>Developer &amp; Contributor Guide</h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#developer--contributor-guide\"></a><p></p>\n<p></p><h3>Manual Build</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#manual-build\"></a><p></p>\n<p>(Also listed above.)</p>\n<div><pre>git clone https://github.com/banagale/FileKitty.git\n<span>cd</span> FileKitty\npoetry install\npoetry run python setup.py py2app</pre></div>\n<p>The app bundle will be created in <code>./dist/</code>.</p>\n<hr />\n<p></p><h3>Linting &amp; Formatting</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#linting--formatting\"></a><p></p>\n<p>Uses <a target=\"_blank\" href=\"https://docs.astral.sh/ruff/\">Ruff</a>:</p>\n<div><pre>make lint <span><span>#</span> Run linter</span>\nmake format <span><span>#</span> Format code</span>\n<span><span>#</span> or directly</span>\npoetry run ruff check <span>.</span>\npoetry run ruff format <span>.</span></pre></div>\n<hr />\n<p></p><h3>Pre-commit Hooks</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#pre-commit-hooks\"></a><p></p>\n<p>Set up local linting before commits:</p>\n<div><pre>pre-commit install\npre-commit run --all-files</pre></div>\n<hr />\n<p></p><h3>Continuous Integration</h3><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#continuous-integration\"></a><p></p>\n<ul>\n<li>GitHub Actions validate linting and build on every push</li>\n<li>See <code>.github/workflows/</code> for full pipeline</li>\n</ul>\n<hr />\n<p></p><h2>License</h2><a target=\"_blank\" href=\"https://github.com/banagale/FileKitty#license\"></a><p></p>\n<p>MIT License © Rob Banagale</p>\n</article></div>",
"author": "",
"favicon": "https://github.githubassets.com/favicons/favicon.svg",
"source": "github.com",
"published": "",
"ttr": 78,
"type": "object"
}