Getting Into Pd James The Murder Room
I've spent a fair bit of time dealing with this over the years, and it's one of those things that sounds far more complicated than it actually is until you hit the first real snag. Pd James The Murder Room is a ColdFusion-based toolkit for tracking and investigating homicide cases, originally built around the BBC radio series format but eventually adapted into a standalone system that forensic teams and case review units have used to reorganize evidence. The interface is dated, the documentation is thin, and that's pretty much the whole story right there. It's not a single application. The name covers a loosely connected set of scripts, database templates, and investigation workflow tools that were released over time. At its core, it's a case management system built on Adobe ColdFusion with a MySQL backend. You import case files, link witness statements, tag evidence items, and build timelines. That's the entire pitch. What people miss initially is that the system doesn't do analysis. It doesn't flag inconsistencies or suggest leads. It just stores and cross-references. If you're expecting it to surface patterns, you'll be disappointed.
Setting It Up
You need a ColdFusion server environment. Most people run this on either Adobe ColdFusion 11 or the open-source Railo/Acf historically. I ran mine on a Linux box with a LAMP stack and installed the open-source ColdFusion fork called OpenBD because Adobe licenses are not worth chasing down for a tool this old. Your host must support CFML and MySQL. PHP alone won't cut it. Download the package from whatever mirror is still up. The main archive tends to rotate hosts, so I keep a local copy saved. Extract it, point your web server to the root directory, and run the install script at the base path. It will ask for your database credentials and create the schema. The default tables are CaseInfo, Evidence, Witness, TimelineEntry, and LinkTable. Nothing exotic. Configuration lives in Application.cfm and a handful of .cfm files in the config folder. You'll want to change the default admin password immediately. It ships as admin123, and yes, that has been a problem more than once when I handed systems over to less careful colleagues.
Importing a Case
The import process is where things get fiddly. The system expects CSV or XML exports from compatible case management formats. If you're working from paper records or scanned documents, you need to key everything in manually through the web interface, which is slow and painful. I found it faster to write a small Python script that converts my exported PDF records into the CSV structure the importer expects. That took me about two evenings and cut my data entry time down to roughly a third of what it would have been otherwise. The CSV header needs to match exactly: CaseID, Type, Description, Date, Source, and LinkRef. Missing columns cause silent failures. The system will import the row but drop any fields you don't include, and you won't know until you're three weeks into an investigation and realize the witness statement dates are missing.
Get the Full Details

A Real Problem I Hit
One thing that caught me out was the timeline sorting behavior. The system sorts entries by the raw date string field, which means if your dates aren't in strict YYYY-MM-DD format, everything breaks. I had a case file with dates written as "15 March 1998" and "03/12/1997" mixed together, and the timeline view rendered in completely wrong order. It looked like the killer was moving backward through time, which is unsettling for anyone reviewing the case. The workaround is straightforward but not documented anywhere obvious. There's a hidden preference toggle in the config that forces date parsing through a reformatter before display. I found it by digging through the View.cfm source code and noticing it called a utility function called formatDateStandard(). Once I set that flag to true and preprocessed my dates into ISO format using a quick script, the timeline sorted correctly. Took me about ten minutes once I knew where to look. Ten minutes I wish I hadn't wasted the first time around.
Common Pitfalls
Memory leaks are the big one. The original build doesn't manage its database connections aggressively. Under sustained use with large case files, connection pools exhaust and the system starts throwing timeout errors. I've seen it stall completely after about six hours of active use on a system with over 2,000 linked records. The fix is to add connection recycling in your application.cfc settings, specifically by setting maxConnections lower and enabling timeout recycling. This usually stabilizes things without any visible performance hit. Another issue is the link table design. Evidence items can only link to one case record at a time in the default schema. If you're working multi-jurisdiction cases where the same piece of evidence appears across two investigations, you need to fork the record manually or modify the schema to allow many-to-many relationships. This is a structural limitation, not a bug, and patching it requires dropping the existing LinkTable and rebuilding it with a junction table structure. Budget a few hours for that work if you know you'll need it.
What It Does Well
The search functionality is decent. Full-text search across witness statements and evidence descriptions works reliably, and the boolean operators are supported. If you need to find every mention of a specific address across dozens of case files, it does that quickly. The export feature also works cleanly for CSV and basic PDF generation. The system is also lightweight enough to run on modest hardware. A basic VPS with 2GB RAM handles small to medium caseloads without issue. This makes it practical for smaller police departments or volunteer review boards that can't afford enterprise case management software.

Where It Falls Apart
Security is the main concern. This software predates modern web security standards by a significant margin. There's no CSRF protection on the form submissions, SQL injection risks exist in older versions, and session handling is naive. If you're running this on a network exposed to the internet, you need to treat it like any legacy application: put it behind a reverse proxy, enforce HTTPS, and lock down the database to localhost only. I learned this the hard way when I noticed unusual query patterns in my database logs during a test deployment on a non-isolated server. Maintenance is another issue. The community around this project is small and aging. Bug reports go unanswered for months. Workarounds for common problems are scattered across old forums and archived posts. You're going to be reading source code and experimenting before you solve things that should be simple.
Alternatives Worth Considering
If you're starting fresh and don't have existing Pd James The Murder Room data to migrate, you might want to look at dedicated case management platforms like FAMIS or open-source options like OpenCTI for link analysis. These have active development, better security, and proper documentation. The tradeoff is cost and complexity. Pd James The Murder Room runs on nothing but a cheap server and some free software, which matters if your budget is zero. For people already invested in the system, the pragmatic move is usually to keep running it but isolate it completely from any external-facing network. Use it as a local repository and only export data when you need to share findings externally. That keeps the security risks contained and lets you use the tool for what it was built for without exposing yourself to unnecessary risk.
Bottom Line
Pd James The Murder Room is functional but rough. It does exactly what it claims to do: organize case data and let you search across it. It does not do anything cleverer than that. If you understand its limitations and set it up properly, it serves its purpose. If you expect more, you'll end up frustrated. The documentation isn't going to save you, so expect to read the code and figure things out yourself.
