Applied Module 12 · The OFCI Playbook

The OFCI Command Center

What you'll learn

~60 min
  • Build an Express.js dashboard server integrating data from all procurement tools
  • Implement a Monday Morning Run that refreshes all data sources and generates a prioritized briefing
  • Create a portfolio overview with project cards, RAG status, and drill-down views
  • Build a Top 15 priority action queue that surfaces the most urgent items across all tools

What you’re building

It’s 7 AM on Monday. You open your laptop and need to answer one question: “What do I need to do this week?” Right now that means checking email, opening three spreadsheets, scanning Procore for submittals, looking at the delivery calendar, hoping you don’t miss something critical, and trying to remember that thing from Friday that you swore you’d remember on Monday. You never remember. Nobody remembers.

The OFCI Command Center kills that entire ritual. One URL. One dashboard. One button. You click “Monday Morning Run” and in 10 seconds you have:

  • Portfolio health across all projects (RAG scorecards)
  • Your Top 15 most urgent action items, ranked by an algorithm that’s better at prioritizing than your Monday-morning brain
  • Overdue submittals that need follow-up calls
  • Procurement windows closing this week
  • Deliveries scheduled in the next 14 days
  • Budget variances that need attention

This is the capstone. Every tool you’ve built in this module becomes a data source that feeds the Command Center. Seven tools, one dashboard, zero “oh shit I forgot about the SV9 switchgear.”

💬The Monday Morning Run

You know the feeling — it’s drop day and you’re hitting 203, 374, and 131 before anybody else gets the call. You’ve got your route, you know which stores to trust and which ones will lie to your face, and you’re not wasting time on stores that never have shit. Your Monday Morning Run is the procurement version. One click, full refresh, prioritized action queue. No driving to six stores. No “oh crap I forgot about the SV9 switchgear submittal.” Just clarity, first thing, every week. That’s the whole damn point of everything we’ve built.

By the end of this lesson you will have a web dashboard — a page you open in your browser, like any website — that aggregates data from all your procurement tools, provides a portfolio overview with project-level drill-downs, runs a “Monday Morning Run” to refresh all data and generate a prioritized action queue, and gives you a single operational cockpit for OFCI procurement management. It’s the thing you wish you’d had for the last five years.

Software pattern: Unified operations dashboard with orchestration

Multiple tool outputs → data aggregation layer → prioritized action queue → web dashboard with drill-downs. This pattern works for any operations center: NOC dashboards, DevOps control panels, executive command centers, project management hubs. The key insight is that individual tools are useful, but a unified view with intelligent prioritization is transformative.

🔍What's different about this lesson (read this first)

Lessons 1-7 built CLI tools — you typed a command, got text output. This lesson builds a web dashboard — a local website running on your machine that you view in Chrome or Edge.

Here’s the plain-English version of the new tech involved:

  • Express.js is a tiny web server. It’s like a local version of a website — instead of going to google.com, you go to localhost:3000 (your own machine). When you type node server.js, you’re starting that local website.
  • EJS templates are HTML pages with blanks that get filled in with your data. Think of them like mail merge in Word — the template has placeholders, and the server fills them in with your actual project numbers before showing you the page.
  • Routes are just URLs. When you click a project card, the browser goes to /project/SV9, and the server knows to show you the SV9 detail page. It’s the same as clicking a link on any website.
  • The data directory is where the dashboard reads JSON files from. These are the same output files your other tools generate. The dashboard doesn’t do any procurement logic itself — it just reads the results and displays them visually.

The AI CLI tool handles all the code. You paste one prompt and get a working dashboard. The only difference from previous lessons is that instead of running node src/index.js and reading terminal output, you run node server.js and open a browser tab.


The showcase

Here’s what you’re looking at when you open localhost:3000:

  • Dashboard home: Portfolio overview with project cards showing RAG status, budget health, and key metrics. Think of it as the “how screwed am I?” view, but prettier.
  • Monday Morning Run: One-click refresh that reads all data sources and generates the weekly briefing + action queue. This is the button that replaces your entire Monday morning orientation routine.
  • Top 15 Queue: Prioritized list of the 15 most urgent action items across all tools and projects, ranked by impact and urgency. Not ranked by “whichever PM yelled at you last,” which is how most of us currently prioritize.
  • Project drill-down: Click a project card to see the detailed scorecard, submittals, lead times, budget, and deliveries. Everything you need to walk into a project meeting and not look like you’re winging it.
  • Responsive design: Works on laptop (primary) and tablet (site visits). Because sometimes you need to pull this up in a construction trailer and pretend you knew about the delivery conflict all along.

The prompt

Build a Node.js/Express web dashboard called ofci-command-center that serves
as a unified operations hub for data center MEP procurement management.
PROJECT STRUCTURE:
ofci-command-center/
package.json
server.js (Express server entry point)
src/
aggregator.js (reads data from all tool output directories)
prioritizer.js (Top 15 action queue ranking engine)
monday-run.js (Monday Morning Run orchestrator)
routes/
dashboard.js (main dashboard routes)
api.js (JSON API routes for dynamic updates)
public/
css/
styles.css (dashboard styling — dark theme)
js/
dashboard.js (client-side interactivity)
views/
layout.ejs (base HTML layout with nav)
dashboard.ejs (main dashboard view)
project.ejs (project detail view)
briefing.ejs (Monday Morning Run briefing view)
data/
sv9/ (symlink or copy of tool output data)
budget.json
submittals.json
leadtimes.json
deliveries.json
ch2/
budget.json
submittals.json
leadtimes.json
deliveries.json
den3/
budget.json
submittals.json
leadtimes.json
deliveries.json
REQUIREMENTS:
1. EXPRESS SERVER (server.js)
- Port: 3000 (configurable via PORT env var)
- View engine: EJS
- Static files from public/
- Routes: / (dashboard), /project/:code (detail), /briefing (Monday Run),
/api/status (JSON health check), /api/refresh (trigger data reload)
2. DASHBOARD VIEW (views/dashboard.ejs)
Main page with four sections:
a. PORTFOLIO HEADER
- Title: "OFCI Command Center"
- Last refresh timestamp
- "Monday Morning Run" button (triggers full refresh)
- Portfolio-level stats: total projects, total equipment items, overall budget
b. PROJECT CARDS (grid layout, 1 card per project)
Each card shows:
- Project code and site name
- Overall RAG status (large colored indicator)
- Four mini RAG indicators for schedule, budget, submittals, deliveries
- Key number: total budget and variance %
- Key number: days to next delivery
- Click to drill down to project detail view
c. TOP 15 ACTION QUEUE
Ranked list of the 15 most urgent items across all projects:
- Each item has: rank number, urgency indicator (🔴🟡🟢), project code,
action description, source tool, due/deadline
- Example items:
"🔴 SV9 — Issue PO for switchgear (order-by date was 14 days ago) [Lead Time]"
"🔴 CH2 — Follow up on Eaton submittal (22 days overdue, Tier 3) [Submittals]"
"🟡 DEN3 — Confirm crane for March 28 generator delivery [Deliveries]"
"🟡 SV9 — Review chiller budget variance (12% over) [Budget]"
- Clicking an item shows details in a slide-out panel
d. UPCOMING WEEK
Timeline showing the next 7 days with scheduled deliveries,
submittal deadlines, and order-by dates across all projects.
3. PROJECT DETAIL VIEW (views/project.ejs)
Detailed view for a single project:
- Full scorecard with RAG status for all four dimensions
- Budget summary with variance table
- Submittal status breakdown with overdue list
- Lead time watchboard for that project's equipment
- Upcoming deliveries with conflict indicators
- Back link to main dashboard
4. MONDAY MORNING RUN (src/monday-run.js)
When triggered (via button click or /api/refresh):
- Reload all JSON data files from the data directory
- Recalculate all RAG statuses and scores
- Regenerate the Top 15 action queue
- Generate a briefing summary (key changes since last run)
- Save a snapshot to data/snapshots/YYYY-MM-DD.json
- Redirect to /briefing to show the results
5. TOP 15 PRIORITIZER (src/prioritizer.js)
Scoring algorithm for action queue ranking:
- Base score by source:
Lead time (black status) = 100
Lead time (red status) = 80
Submittal (Tier 3 overdue) = 90
Submittal (Tier 2 overdue) = 60
Delivery conflict = 70
Delivery unconfirmed (<14 days) = 50
Budget variance (>10%) = 40
Budget variance (5-10%) = 20
- Modifiers:
+ days_overdue (for submittals — always positive, adds to urgency)
+ abs(days_past_order_by) (for lead times — use absolute value so past-due items score HIGHER, not lower)
+ equipment_criticality multiplier (generator/switchgear = 1.5x, chiller/UPS = 1.2x, CRAH/PDU = 1.0x)
- Formula: final_score = (base_score + days_modifier) * criticality_multiplier
- Sort by final score descending, take top 15
6. STYLING (public/css/styles.css)
Dark theme matching data center aesthetics:
- Background: #0a0a0f (near black)
- Cards: #1a1a2e with subtle border
- Text: #e0e0e0 (light gray)
- RAG colors: Red #ef4444, Amber #f59e0b, Green #22c55e
- Accent: #D97706 (amber — matches track theme)
- Font: system-ui for body, monospace for numbers/codes
- Responsive grid: 3 columns on desktop, 2 on tablet, 1 on mobile
DEPENDENCIES: express, ejs, chalk
SAMPLE RUN:
cd ofci-command-center
npm install
node server.js
# Open http://localhost:3000
# Click "Monday Morning Run" to refresh data and see the briefing
# Click any project card to drill into details
# The Top 15 queue shows your most urgent actions across all projects
💡The capstone experience

This lesson ties everything together. The data files in the data/ directory simulate what you’d get from running the tools you built in Lessons 1-7. In a real deployment, you’d point the aggregator at the actual output directories of those tools. For now, the sample JSON files give you a working dashboard to demonstrate the concept.


What you get

Fire it up

Terminal window
cd ofci-command-center
npm install
node server.js

Open http://localhost:3000 in your browser. You should see the OFCI Command Center with project cards, the Top 15 action queue, and the Monday Morning Run button. If this is the first time you’ve built something with a browser interface from a single prompt — yeah, that reaction is normal. It’s a whole-ass dashboard. From one paste.

If something is off

ProblemFollow-up prompt
Express server crashes on startupThe server fails to start. Make sure server.js has correct requires for express and path, sets up the EJS view engine with app.set('view engine', 'ejs') and app.set('views', path.join(__dirname, 'views')), and serves static files from public/ with app.use(express.static('public')). Also ensure all view files exist in the views/ directory.
EJS templates show raw variablesThe templates show raw <%%= variable %> tags instead of rendered values. Make sure the route handlers pass the data object to res.render() as the second argument: res.render('dashboard', { projects, actions, lastRefresh }). Also check that the EJS syntax uses <%%= %> for escaped output and <%%- %> for unescaped HTML.
Project cards don’t link to detail viewClicking a project card doesn't navigate to the detail page. Make sure each card is wrapped in an anchor tag with href="/project/<%%- project.code %>" and that the /project/:code route exists in routes/dashboard.js and passes the correct project data to the project.ejs template.
Monday Morning Run doesn’t refresh dataThe refresh button sends a request but data doesn't update. Make sure the /api/refresh route re-reads all JSON files from disk (not from a cached variable), recalculates scores, and saves a snapshot. After refresh, redirect to /briefing or reload the dashboard. Use synchronous file reads or await async reads before sending the response.

🔧

When Things Go Wrong

Use the Symptom → Evidence → Request pattern: describe what you see, paste the error, then ask for a fix.

Symptom
The Top 15 queue shows the same project's items exclusively
Evidence
All 15 action items are from SV9, even though CH2 and DEN3 also have urgent items
What to ask the AI
"The prioritizer is likely loading data from only one project's directory. Make sure aggregator.js reads data from ALL project subdirectories in the data/ folder, not just the first one found. The prioritizer should score items from all projects in a single array, then sort and take the top 15. If one project genuinely has all 15 most urgent items, add a diversity bonus to ensure at least the top item from each project appears."
Symptom
The dashboard looks broken on mobile / tablet
Evidence
Project cards overlap, text is cut off, and the action queue is unreadable on iPad
What to ask the AI
"The CSS grid needs responsive breakpoints. Use CSS Grid with: grid-template-columns: repeat(3, 1fr) for desktop (>1024px), repeat(2, 1fr) for tablet (768-1024px), and 1fr for mobile (<768px). Action queue items should stack vertically with full width on mobile. Add min-width: 0 to grid children to prevent overflow."
Symptom
The Monday Morning Run snapshot saves but doesn't show changes
Evidence
I click Monday Morning Run, it says 'Refresh complete', but the briefing view shows the same data as before
What to ask the AI
"The refresh route needs to clear the in-memory cache before re-reading files. If you're caching the aggregated data in a module-level variable, set it to null before re-reading. Also make sure the briefing view reads from the freshly-saved snapshot, not from the stale cache. Add a 'last refreshed' timestamp that updates visibly in the UI."

How it works (the 2-minute explanation)

Four moving pieces, and none of them are complicated on their own. The power is in the wiring.

  1. Express server serves an EJS-templated web dashboard on port 3000. That’s it — it’s a local website. Routes handle the main dashboard, project detail views, and the Monday Morning Run briefing. When you click things, the server shows you different pages with different data. If you’ve ever used a website, you already understand this part.
  2. Aggregator reads JSON data files from each project’s subdirectory and merges them into a unified data model. Think of it as the thing that takes output from seven different tools and makes one big picture out of it. Without this, you’re the aggregator — and you’re doing it in your head every Monday morning while also trying to remember if you fed the dog.
  3. Prioritizer is the part that makes this thing actually useful. It scores every actionable item across all tools and projects using a weighted algorithm that considers urgency, impact, and equipment criticality. Then it ranks them and gives you the top 15. Your brain is great at procurement decisions. It’s terrible at remembering which of 100 items across three projects needs attention first. Let the algorithm handle the sorting so your brain can handle the decisions.
  4. Monday Morning Run re-reads all data sources, recalculates everything, saves a snapshot for historical comparison, and generates the weekly briefing. One click. Full refresh. Prioritized action queue. That’s the whole thing.
🔍From seven tools to one platform

Look at what you’ve built across this module:

  1. RFP Machine → generates procurement documents
  2. Vendor Scorecard → evaluates bids with weighted scoring
  3. Submittal Tracker → manages submittal lifecycles
  4. Lead Time Watchboard → monitors procurement windows
  5. Budget Hound → tracks financial health
  6. Delivery War Room → coordinates logistics
  7. Executive Briefing → synthesizes for leadership
  8. Command Center → unifies everything into one view

Each tool solves one problem well. The Command Center connects them into an integrated procurement operating system. This is the difference between having seven useful scripts and having a platform. And you built it all from prompts.


Customize it

You’ve got a working command center. Now make it yours. These are the extensions that turn “cool demo” into “this is how I actually run my portfolio.”

Add a Slack/Teams notification integration

Add a --notify flag to the Monday Morning Run that formats the Top 5 most
urgent action items as a Slack-compatible webhook payload. Send to a configured
webhook URL. Include the overall portfolio RAG status, the Top 5 items with
urgency indicators, and a link to the dashboard. This lets your team see the
Monday briefing without opening the dashboard.

Add historical trend charts

Add a /trends route that loads all snapshots from data/snapshots/ and shows
time-series charts: portfolio budget variance over time, submittal completion
rate over time, and average lead time window health over time. Use Chart.js
or a simple ASCII chart library. This lets you see whether your procurement
health is improving or declining month over month.

Add a custom action queue

Add the ability to pin, snooze, or dismiss items from the Top 15 queue.
Pinned items always appear at the top regardless of score. Snoozed items
disappear for N days then reappear. Dismissed items are hidden until the
next Monday Morning Run regenerates the queue. Store preferences in a
user-prefs.json file.

Try it yourself

  1. Open your CLI tool in an empty folder.
  2. Paste the main prompt. Go get coffee while it builds. Actually, it’ll probably be done before you stand up.
  3. Run npm install && node server.js and open the dashboard.
  4. Click the Monday Morning Run button and review the briefing. This is the moment it all clicks.
  5. Click each project card and explore the detail views. Everything you used to hold in your head is now on a screen.
  6. Scan the Top 15 queue — imagine this is your actual Monday morning. What would you do first? The algorithm already answered that for you, but it’s worth checking whether your gut agrees.
  7. Pick one customization and add it. The Slack notification is the one most people want first, because your PM is going to lose their mind when they see this.

This is the tool you open at 7 AM every Monday. If it saves you 30 minutes of “what do I need to focus on?” orientation time, that’s 26 hours per year. If it prevents one missed delivery or one forgotten submittal follow-up, it’s paid for itself ten times over. And it cost you nothing but a prompt.


Key takeaways

  • Unified views beat scattered tools, and it’s not close — seven individual CLI tools are powerful, but a single dashboard that aggregates them all shows you connections and conflicts that no individual tool reveals. That delivery conflict on DEN3 that intersects with the budget variance on SV9? You’d never catch that in separate spreadsheets.
  • The Monday Morning Run is the killer feature — one click, full refresh, prioritized action queue. It turns “let me check everything and hope I don’t miss something” into “here’s what matters, ranked, with context.” Your Monday mornings just got 30 minutes shorter and significantly less stressful.
  • Prioritization by algorithm beats prioritization by memory — your brain is good at procurement decisions. It’s not good at remembering which of 100 items across three projects needs attention first. That’s not a character flaw, that’s just how brains work. The scoring algorithm handles the sorting so you can focus on the actual work.
  • You built all of this from prompts — eight lessons, eight tools, one integrated platform. The IT department would’ve needed a budget request, three meetings, and a vendor evaluation just to START talking about this. You built it in a weekend.

KNOWLEDGE CHECK

You open the Command Center on Monday morning. The Top 15 queue shows item #1 as '🔴 SV9 — Issue PO for switchgear (order-by date was 14 days ago)' and item #2 as '🔴 CH2 — Follow up on Eaton submittal (22 days overdue, Tier 3).' Both are critical. How does the prioritizer determine that the switchgear PO is #1?


Module complete

You just built eight tools and a command center from prompts. Eight. Every one runs locally on your machine. Every one solves a real problem you face every week. Here’s the full lineup:

LessonToolWhat It Does
1RFP MachineGenerates complete RFP documents from rough equipment specs
2Vendor ScorecardEvaluates vendor bids with weighted multi-criteria scoring
3Submittal TrackerTracks submittal lifecycles across projects with overdue alerts
4Lead Time WatchboardMonitors procurement windows and calculates order-by dates
5Budget HoundAnalyzes budget variances with waterfall charts and narratives
6Delivery War RoomManages delivery logistics with conflict detection
7Executive BriefingGenerates portfolio scorecards and risk heat maps for VP review
8OFCI Command CenterUnified dashboard with Monday Morning Run and Top 15 queue

The gap between “construction procurement manager” and “construction procurement manager who builds custom AI-powered tools” is eight prompts wide. You just crossed it. The IT department didn’t need to be involved. No software vendor gave you a demo. No budget request sat in someone’s inbox for six weeks. You just… built the thing you needed.

Now go open something good. Might I suggest the Provenance 14 — absolute overload of dark fruit, like Gushers fruit snacks overload. You’ve earned it.