{"id":49596835,"url":"https://github.com/funwithcthulhu/radiology-ppt","last_synced_at":"2026-06-12T02:01:15.623Z","repository":{"id":354955714,"uuid":"1225971808","full_name":"funwithcthulhu/radiology-ppt","owner":"funwithcthulhu","description":"Windows desktop app for building Radiopaedia case-based PowerPoints","archived":false,"fork":false,"pushed_at":"2026-06-09T22:08:20.000Z","size":1617,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-10T00:07:15.009Z","etag":null,"topics":["csharp","desktop-app","medical-education","nodejs","powerpoint","radiology","radiopaedia","windows","windows-installer","wpf","wpf-application"],"latest_commit_sha":null,"homepage":"https://github.com/funwithcthulhu/radiology-ppt/releases/latest","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/funwithcthulhu.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-30T20:53:37.000Z","updated_at":"2026-06-09T22:08:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/funwithcthulhu/radiology-ppt","commit_stats":null,"previous_names":["funwithcthulhu/radiology-ppt"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/funwithcthulhu/radiology-ppt","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funwithcthulhu%2Fradiology-ppt","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funwithcthulhu%2Fradiology-ppt/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funwithcthulhu%2Fradiology-ppt/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funwithcthulhu%2Fradiology-ppt/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/funwithcthulhu","download_url":"https://codeload.github.com/funwithcthulhu/radiology-ppt/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funwithcthulhu%2Fradiology-ppt/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34225351,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["csharp","desktop-app","medical-education","nodejs","powerpoint","radiology","radiopaedia","windows","windows-installer","wpf","wpf-application"],"created_at":"2026-05-04T05:02:08.519Z","updated_at":"2026-06-12T02:01:15.617Z","avatar_url":"https://github.com/funwithcthulhu.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Radiopaedia Case PowerPoint Builder\n\n[![CI](https://github.com/funwithcthulhu/radiology-ppt/actions/workflows/ci.yml/badge.svg)](https://github.com/funwithcthulhu/radiology-ppt/actions/workflows/ci.yml)\n[![Latest Release](https://img.shields.io/github/v/release/funwithcthulhu/radiology-ppt?label=latest%20installer)](https://github.com/funwithcthulhu/radiology-ppt/releases/latest)\n[![License: MIT](https://img.shields.io/badge/license-MIT-97ca00)](LICENSE)\n[![Windows App](https://img.shields.io/badge/app-C%23%20WPF%20%2B%20Node-0f766e)](docs/ARCHITECTURE.md)\n\nWindows desktop app for building case-based radiology PowerPoints from Radiopaedia.\n\nAdd case requests, review the prepared cases and images, then export the approved cases to PowerPoint. The app uses a C# WPF interface with a local Node backend.\n\n## What It Builds\n\nFor each approved case, the app creates a teaching sequence:\n\n1. `Case N`\n2. radiology image slide\n3. diagnosis slide\n4. optional teaching-points or Core Review slide\n\nThe case intro slide avoids giving away the diagnosis when possible. If clean patient information is available and enabled, it uses minimal age/sex context such as `The patient is a 50-year-old female.`\n\n## Features\n\n- Case requests for named diagnoses, random pulls, or exact Radiopaedia URLs.\n- Dropdown filters for modality, anatomy, area, age group, topic focus, and difficulty.\n- Random selection that avoids recent, skipped, and rejected cases when possible.\n- Review before export, with controls to keep, favorite, skip, reroll, re-pick, replace, remove, or manually choose images.\n- Deterministic image-selection rationale in the review window and generated manifest.\n- Local Library view for reviewed cases and favorites.\n- PowerPoint presets including `Fast Preview`, `Ollama Assisted`, `Core Review Teaching`, and `Dark Conference`.\n- Separate Core Review workflow for review decks without using the Cases view.\n- Optional local Ollama image scoring for prepared images as a review aid.\n- Random mode searches live Radiopaedia first and avoids cases selected in previous random runs by default.\n- Local SQLite cache for Radiopaedia metadata, image candidates, random history, review decisions, and backend diagnostics.\n- Persistent local Node backend service with idle health checks.\n\n## Documentation\n\n- [User Guide](docs/USER_GUIDE.md)\n- [Decision Logic](docs/DECISION_LOGIC.md)\n- [AI Boundaries](docs/AI_BOUNDARIES.md)\n- [Architecture](docs/ARCHITECTURE.md)\n- [Troubleshooting](docs/TROUBLESHOOTING.md)\n- [Manual Radiology Smoke Test](docs/manual-radiology-smoke-test.md)\n- [Contributing](docs/CONTRIBUTING.md)\n- [Releasing](docs/RELEASING.md)\n- [Security And Privacy](SECURITY.md)\n\n## Install\n\nInstall from GitHub Releases:\n\n1. Open the [GitHub Releases page](https://github.com/funwithcthulhu/radiology-ppt/releases).\n2. Download the latest `Radiopaedia-Case-PowerPoint-Builder-Setup-v*.exe`.\n3. Run the installer.\n4. Launch `Radiopaedia Case PowerPoint Builder` from Start or the optional desktop shortcut.\n\nFor source-checkout development, build the packaged app under `dist\\`:\n\n```text\ndist\\Radiopaedia Case PowerPoint Builder\\Radiopaedia Case PowerPoint Builder.exe\n```\n\nIf the packaged app is missing, build it from the repository root:\n\n```powershell\n.\\build-csharp-app.ps1\n.\\create-desktop-shortcut.ps1\n```\n\nRun from source while developing:\n\n```powershell\ndotnet run --project .\\csharp\\RadiologyPpt.App\\RadiologyPpt.App.csproj\n```\n\nSource-checkout builds expect the packaged executable to stay inside this repository. The app locates backend resources by walking up to the project root and finding `src\\backend-service.mjs`; copying only the `.exe` elsewhere will not work.\n\n## Basic Workflow\n\n1. Add case requests in `Cases`.\n2. Set filters if needed.\n3. Choose PowerPoint options or a preset.\n4. Click `Generate PowerPoint`.\n5. Review cases and images.\n6. Export the approved cases.\n\nThere is no success popup after export. Use the left status area, Activity, `Open Last PowerPoint`, or `Open Outputs Folder`.\n\n## Navigation\n\n- `Cases`: request grid for diagnoses, random pulls, or Radiopaedia URLs.\n- `Core Review`: generate review PowerPoints and import PDFs, Word `.docx` documents, PowerPoint `.pptx` decks, notes, or JSON study material for local practice questions.\n- `Library`: local history of reviewed cases with decision, image count, score, and case path.\n- `Activity`: diagnostics, backend logs, SQLite/cache counts, state folder access, cleanup, and maintenance.\n\nThe app keeps main and review windows within the visible Windows work area on launch, including high-DPI/scaled displays.\n\n## Review Window\n\nUse the review window to approve cases and adjust images before export.\n\nCore actions include keep, favorite, skip, reroll, re-pick images, replace unchecked images, remove unchecked images, and manual candidate selection. `Details` shows source metadata, warnings, prompt text, and image-selection rationale.\n\nKeyboard shortcuts: `K` keep, `F` favorite, `S` skip, `R` reroll, `I` re-pick, `Delete` remove unchecked, and `Esc` cancel.\n\n## Local Data\n\nThe app writes generated/private data to:\n\n- `state\\radiology-ppt.sqlite`\n- `cache\\`\n- `scratch\\`\n- `outputs\\`\n- `review-sessions\\`\n- `library\\board-review\\`\n\nSource-checkout runs use the repository root. Installed runs use `%LOCALAPPDATA%\\RadiopaediaCasePowerPointBuilder`. The Activity tab shows the active paths.\n\nThese paths are ignored by Git. SQLite stores settings, review history, generated PowerPoint metadata, backend cache rows, random history, case/image decisions, backend job diagnostics, prepared-case indexes, and schema migrations.\n\nUse the `Activity` tab to refresh diagnostics, clean scratch files, clean old cache files, open the state folder, or run maintenance/SQLite optimization.\n\n## Architecture Summary\n\n- `csharp\\RadiologyPpt.App`: C# WPF desktop GUI, review flow, settings, local storage, and view models.\n- `csharp\\RadiologyPpt.App\\BackendClient.cs`: JSONL process boundary to the local Node service.\n- `csharp\\RadiologyPpt.App\\BackendContracts.cs`: C# payload builders/readers for the Node JSON contract.\n- `csharp\\RadiologyPpt.App\\BackendHealthMonitor.cs`: backend ping/restart watchdog.\n- `src\\backend-service.mjs`: persistent local JSONL backend service.\n- `src\\backend-api.mjs`: workflow API for prepare, score, render, Core Review PowerPoint planning, ingestion, and quiz assembly.\n- `src\\radiopaedia.mjs`: small facade for Radiopaedia case fallback orchestration.\n- `src\\radiopaedia-search.mjs`: search URLs, search-result parsing, random selection, indexed random reuse, and random-history expansion.\n- `src\\radiopaedia-case-fetch.mjs`: case page loading, study/image loading, image preparation, and final case assembly.\n- `src\\radiopaedia-case-text.mjs`: patient data, intro text, prompt redaction, and teaching points.\n- `src\\app-store.mjs`: backend SQLite cache/history/index/review-decision storage.\n- `src\\deck.mjs`: PowerPoint rendering.\n- `src\\contracts`: JSON schema contracts for C# to Node payloads.\n- `docs\\DECISION_LOGIC.md`: explanation of case, image, random, and storage decisions.\n\nSee [Architecture](docs/ARCHITECTURE.md) for details.\n\n## Developer Setup\n\nPrerequisites:\n\n- .NET 8 SDK / Windows Desktop runtime\n- Node.js\n- `npm install` or `npm ci`\n- PowerShell\n\nRun checks before pushing:\n\n```powershell\nnpm test\ndotnet build .\\csharp\\RadiologyPpt.App\\RadiologyPpt.App.csproj --configuration Release\n```\n\nBuild and refresh the desktop app:\n\n```powershell\n.\\build-csharp-app.ps1\n.\\create-desktop-shortcut.ps1\n```\n\nBuild the Windows installer:\n\n```powershell\n.\\build-windows-installer.ps1 -Version 0.3.1\n```\n\nGitHub Actions runs Node tests and the WPF Release build on Windows.\n\n## Core Review\n\nCore Review has its own review-deck path. Set a case count, domain, random selection mode, modality mix, and optional output `.pptx` path, then click `Generate Core Review PowerPoint`. The app builds a domain-scoped plan, searches Radiopaedia for matching cases, opens the normal review window, and exports only the cases/images you approve. You do not need to select cases in the `Cases` tab for this workflow.\n\nThe bundled diagnosis seed list is original practice scaffolding aligned to public ABR Core domains. It is not official ABR content and is not a board-recall list.\n\nCore Review can also import local PDFs, Word `.docx` documents, PowerPoint `.pptx` decks, notes, and JSON source material into a local study library under `library\\board-review\\`. The imported corpora stay local and are not committed. PDF imports keep page provenance, save page/image assets locally, crop caption-adjacent figure regions when possible, and attach the best supported source image to generated standalone questions.\n\nUse the Core Review `Import Sources` control for study material. The `Cases` importer is only for Radiopaedia request rows or request-list files, and rejects PDF/binary-looking content so raw PDF object text does not become garbage case requests. Legacy `.doc` and `.ppt` files should be saved as `.docx` or `.pptx` before import.\n\nCore Review PowerPoints can source standalone NIS and physics practice questions from:\n\n- the bundled free practice bank\n- the imported local Core Review library\n- a custom question-bank JSON file\n\nQuestion sources affect standalone NIS/physics slides. Case selection comes from the CORE diagnosis plan plus Radiopaedia search and review.\n\nThe repository does not bundle copyrighted board-review books or question banks. Import local materials only when you have the right to use them. Generated Core Review corpora remain ignored by Git.\n\n## License\n\nThis app's source code is licensed under the MIT License. See [LICENSE](LICENSE).\n\nThe MIT License applies to this repository's code, not to Radiopaedia cases/images or user-imported study material. Generated PowerPoints include Radiopaedia attribution; keep that attribution and follow source material terms.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunwithcthulhu%2Fradiology-ppt","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunwithcthulhu%2Fradiology-ppt","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunwithcthulhu%2Fradiology-ppt/lists"}