{"id":43107078,"url":"https://github.com/marcinz606/negpy","last_synced_at":"2026-05-03T20:11:56.833Z","repository":{"id":332444031,"uuid":"1123766609","full_name":"marcinz606/NegPy","owner":"marcinz606","description":"Tool for processing film negatives.","archived":false,"fork":false,"pushed_at":"2026-01-25T19:12:06.000Z","size":41927,"stargazers_count":139,"open_issues_count":6,"forks_count":7,"subscribers_count":10,"default_branch":"main","last_synced_at":"2026-01-26T11:11:34.001Z","etag":null,"topics":["film-photography","image-processing","photography"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/marcinz606.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"ko_fi":"marcinzawalski"}},"created_at":"2025-12-27T15:21:10.000Z","updated_at":"2026-01-26T10:21:57.000Z","dependencies_parsed_at":"2026-01-31T18:01:02.764Z","dependency_job_id":null,"html_url":"https://github.com/marcinz606/NegPy","commit_stats":null,"previous_names":["marcinz606/negpy"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/marcinz606/NegPy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcinz606%2FNegPy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcinz606%2FNegPy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcinz606%2FNegPy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcinz606%2FNegPy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marcinz606","download_url":"https://codeload.github.com/marcinz606/NegPy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marcinz606%2FNegPy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28949274,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-31T14:26:55.697Z","status":"ssl_error","status_checked_at":"2026-01-31T14:26:52.545Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["film-photography","image-processing","photography"],"created_at":"2026-01-31T18:00:50.478Z","updated_at":"2026-05-03T20:11:56.822Z","avatar_url":"https://github.com/marcinz606.png","language":"Python","funding_links":["https://ko-fi.com/marcinzawalski"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"media/icons/icon.svg\" width=\"96\" height=\"96\" alt=\"NegPy Logo\"\u003e\u003ch1\u003eNegPy\u003c/h1\u003e\n\u003c/div\u003e\n\n**NegPy** is a tool for processing film negatives. I built it because I wanted something made specifically for film scans that goes beyond a simple inversion tool. It simulates how film and photographic paper work but also throws in some lab-scanner conveniences.\n\nIt is built with **Python**, running natively on Linux, macOS, and Windows.\n\n---\n\n![alt text](docs/media/0170.png)\n\n---\n\n## 📖 New User Guide\n**[Click here to read the USER_GUIDE.md](docs/USER_GUIDE.md)** — A complete walkthrough of the NegPy workflow, features, and controls.\n\n---\n\n## ✨ Features\n\n*   **No Camera Profiles**: It doesn't use camera profiles or ask you to color-pick the border. It uses math to neutralize the orange mask based on channel sensitometry.\n*   **Positive/Slide Support**: A dedicated **E-6 mode** for processing slide film with optional normalization to save expired or faded film.\n*   **Film Physics**: It models the **H\u0026D Characteristic Curve** of photographic material using a Logistic Sigmoid function instead of doing simple linear inversion.\n*   **Batch Normalization**: Perform bounds analysis for all loaded files and apply averaged settings to all.\n*   **GPU Acceleration**: Real-time processing and export rendering using Vulkan/Metal.\n*   **Dust Removal**: Automatic and manual healing tools with grain synthesis to keep scans clean without looking plastic.\n*   **File Support**: Supports standard RAWs/TIFFs, and specialized formats like Kodak Pakon scanner raw files.\n*   **Non-destructive**: original files are never touched; edits are stored as recipes.\n*   **Keyboard Shortcuts**: [see here](docs/KEYBOARD.md)\n*   **Database**: All edits live in a local SQLite database, keyed by file hash. You can move or rename files without losing your work.\n*   **Persistent Undo/Redo**: Up to 100 edits saved in local db. Persistent across sessions.\n*   **Print Ready**: Export module designed for printing, featuring border controls, ICC soft-proofing, and [dynamic filename templating](docs/TEMPLATING.md).\n\n---\n\n### 🧪 How it works\n\n[📖 Read about the math and the pipeline here](docs/PIPELINE.md)\n\n---\n\n## 🚀 Getting Started\n\n### Download\nGrab the latest release for your OS from the **[Releases Page](https://github.com/marcinz606/NegPy/releases)**.\n\n#### **🐧 Linux**\nI provide an `.AppImage`. Make it executable using `chmod +x` and It should just work.\n\nYou can also clone the repo and build it yourself, instruction here: [CONTRIBUTING.md](CONTRIBUTING.md)\n\n#### **🛡️ Unsigned Software Warning**\nSince this is a free hobby project, I don't pay Apple or Microsoft ransom for their developer certificates. You'll get a scary warning the first time you run it.\n\n**🍎 MacOS**:\n1.  Double click `.dmg` file \u0026 drag the app to `/Applications`.\n2.  Open Terminal and run: `xattr -cr /Applications/NegPy.app` (this gets rid of the warning).\n3.  Launch it.\n\n**🪟 Windows**:\n1. Run the installer (ignore the warnings)\n2. Start the app and click through the warnings.\n\n---\n\n## 📂 Data Location\nEverything lives in your `Documents/NegPy` folder:\n*   `edits.db`: Your edits.\n*   `settings.db`: Global settings like last used export settings or preview size.\n*   `cache/`: Thumbnails (safe to delete).\n*   `export/`: Default export location.\n*   `icc/`: Drop your paper/printer profiles here.\n*   `override.toml`: Startup overrides — see [Troubleshooting / override.toml](#troubleshooting) below.\n\n---\n\n## 🔧 Troubleshooting\n\nIf NegPy crashes on startup or has rendering issues, edit `Documents/NegPy/override.toml`. It is created automatically on first run with sensible defaults for your OS.\n\n```toml\n[rendering]\n# Options: \"auto\", \"vulkan\" (Linux/Win), \"dx12\" (Win), \"metal\" (macOS), \"cpu\"\nbackend = \"vulkan\"\n\n[display]\n# Qt scene-graph backend. Options: \"auto\", \"vulkan\", \"d3d12\", \"metal\", \"opengl\", \"software\"\nqt_rhi_backend = \"auto\"\n\n# Window system plugin (Linux only). Options: \"auto\", \"xcb\", \"wayland\"\nqt_platform = \"auto\"\n\n[performance]\n# Cap GPU texture size in pixels — useful on low-VRAM cards. \"auto\" = no limit.\nmax_texture_size = \"auto\"\n\n# Force HQ preview on/off. Uncomment to override saved preference.\n# force_hq_preview = false\n\n[logging]\n# \"debug\", \"info\", \"warning\", \"error\"\nlevel = \"info\"\n```\n\nSetting `backend = \"cpu\"` disables GPU acceleration entirely — useful if the GPU backend crashes on your hardware.\n\n---\n\n## Roadmap\nThings I want to add later: [ROADMAP.md](docs/ROADMAP.md)\n\n## Changelog:\n\n[CHANGELOG.md](docs/CHANGELOG.md)\n\n---\n\n### For Developers\n\nCheck [CONTRIBUTING.md](CONTRIBUTING.md) for details.\n\n## ⚖️ License\nCopyleft under **[GPL-3](LICENSE)**.\n\n## Support\nIf you like this tool, maybe buy me a roll of film so I have more test data :)\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/marcinzawalski)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcinz606%2Fnegpy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcinz606%2Fnegpy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcinz606%2Fnegpy/lists"}