Applied Module 12 · AI-Powered Bioinformatics Tools

Instrument Schedule Visualizer

What you'll learn

~25 min
  • Build an instrument schedule visualizer with a single AI prompt
  • Parse booking export CSV and render a weekly calendar view with conflict detection using Chart.js
  • Troubleshoot common issues with date parsing, time slot rendering, and utilization calculations
  • Customize the visualizer with multi-instrument views, peak-hour analysis, or exportable reports

What you’re building

Every week someone in the core facility asks the same question: “Is the confocal free on Thursday afternoon?” The answer lives inside iLab, or SUMS, or a shared Google Calendar — but getting a clear picture of what is booked, what is double-booked, and which instruments are sitting idle requires opening three tabs, squinting at overlapping blocks, and doing mental arithmetic about utilization rates.

You are going to build a tool that answers all of those questions in five seconds.

💬This is a viewer, not a booking system

This tool does NOT create, modify, or save bookings. It reads an already-exported CSV of reservations and visualizes it. You still book instruments through your existing system (iLab, SUMS, shared calendar). This tool tells you what the data looks like — conflicts, gaps, utilization patterns — so you can make better scheduling decisions. Think of it as a read-only dashboard on top of your booking export.

By the end of this lesson you will have a standalone instrument schedule visualizer that runs entirely in the browser. Upload a booking export CSV, and it instantly renders a color-coded weekly calendar grid, flags overlapping bookings, calculates utilization rates per instrument, and produces summary statistics. No server, no database, no installation — just one HTML file.

Software pattern: Upload, parse, calendar render

Upload CSV → parse dates and time ranges → map to calendar grid → detect overlaps → calculate utilization → chart + summary. This pattern works for room scheduling, vehicle fleet management, conference room booking analysis — any dataset with resources, start times, and end times.

🔍Domain Primer: Key scheduling terms you'll see in this lesson

New to core facility scheduling? Here are the terms you will encounter:

  • Instrument utilization — The percentage of available hours that an instrument is actually booked. If a confocal is available 10 hours per day and booked for 7, its utilization is 70%. Facility directors track this to justify equipment purchases, plan maintenance windows, and set rate schedules.
  • Booking conflict / double-booking — Two reservations for the same instrument that overlap in time. Some facilities allow this intentionally (e.g., shared instruments with multiple detectors). Most of the time it is a data entry mistake or a calendar sync failure.
  • Prime time vs. off-hours — Most core facilities see heavy demand between 9 AM and 5 PM on weekdays. Evenings and weekends are underutilized. Some facilities offer discounted rates for off-hours to spread demand.
  • Maintenance window — A blocked-out time slot for scheduled instrument maintenance, calibration, or service visits. These reduce available hours and should not count against utilization calculations.
  • iLab / SUMS — Common lab management and scheduling platforms used by university core facilities. Both allow CSV export of booking data.
  • Cancelled / no-show — A reservation that was made but not used. Tracking cancellation rates helps facilities set overbooking policies and identify PIs who habitually block time they do not use.

You do not need to be a scheduling expert — the tool handles the layout and math. You just need to know what the columns in a booking export represent.

Who this is for

  • Core facility administrators who need a visual overview of instrument demand across the week.
  • Business managers who track utilization rates for annual reports and equipment justification.
  • Lab managers who want to spot double-bookings and underused time slots without scrolling through calendar apps.

The showcase

Here is what the finished visualizer looks like once you open the HTML file in a browser:

  • Upload zone at the top for dragging or selecting a booking export CSV.
  • Summary cards showing total bookings, total hours booked, number of conflicts detected, and average utilization across all instruments.
  • Weekly calendar grid with days as columns (Monday-Friday) and hours as rows (7 AM - 9 PM). Bookings appear as colored blocks, with each instrument assigned a distinct color. Overlapping bookings are highlighted with a red border and a conflict icon.
  • Utilization bar chart (Chart.js) showing utilization percentage per instrument, with a dashed line at 80% marking the “high-demand” threshold.
  • Conflict log table listing every detected overlap: instrument, date, the two conflicting bookings, and the overlap duration.
  • Cancelled bookings summary showing how many hours were reserved but cancelled, broken down by instrument.

Everything runs client-side with Chart.js loaded from a CDN. Your scheduling data never leaves the browser.


The prompt

Open your terminal Terminal The app where you type commands. Mac: Cmd+Space, type "Terminal". Windows: open WSL (Ubuntu) from the Start menu. Full lesson → , navigate to a project folder project folder A directory on your computer where the tool lives. Create one with "mkdir my-project && cd my-project". Full lesson → , start your AI CLI tool AI CLI tool Claude Code, Gemini CLI, or Codex CLI — a command-line AI that reads files, writes code, and runs commands. Full lesson → (e.g., by typing claude), and paste this prompt:

Build a single self-contained HTML file called schedule-visualizer.html that
visualizes core facility instrument booking data. This is a READ-ONLY visualization
tool — it does NOT create or save bookings. Requirements:
1. FILE INPUT
- A drag-and-drop zone for CSV upload (dashed border, visual feedback on dragover)
- Click-to-browse fallback
- Parse CSV client-side, handle quoted fields
2. SAMPLE DATA (embed as a "Load Example" button)
Include this instrument booking log with realistic scheduling data:
Booking_ID,Instrument,PI_Name,User_Name,Date,Start_Time,End_Time,Duration_Hours,Project,Status
BK-001,Confocal Microscope,Dr. Sarah Chen,Wei Zhang,2026-03-16,09:00,12:00,3.0,Live cell imaging,Confirmed
BK-002,Flow Cytometer,Dr. James Rivera,Carlos Mendez,2026-03-16,10:00,12:00,2.0,CD4+ sorting,Confirmed
BK-003,qPCR System,Dr. Emily Foster,Emily Foster,2026-03-16,08:00,09:30,1.5,Gene expression panel,Confirmed
BK-004,Confocal Microscope,Dr. Anika Patel,Raj Patel,2026-03-16,11:00,14:00,3.0,Z-stack fixed tissue,Confirmed
BK-005,Sequencer,Dr. Lisa Yamamoto,Kenji Tanaka,2026-03-16,09:00,17:00,8.0,Whole genome seq,Confirmed
BK-006,Flow Cytometer,Dr. Marcus Brown,Marcus Brown,2026-03-16,13:00,15:00,2.0,GFP reporter assay,Confirmed
BK-007,Confocal Microscope,Dr. Sarah Chen,Wei Zhang,2026-03-17,09:00,11:00,2.0,Calcium imaging,Confirmed
BK-008,qPCR System,Dr. James Rivera,Carlos Mendez,2026-03-17,10:00,12:00,2.0,Validation qPCR,Confirmed
BK-009,Flow Cytometer,Dr. Anika Patel,Priya Singh,2026-03-17,09:00,11:30,2.5,Immune panel,Confirmed
BK-010,Sequencer,Dr. Sarah Chen,Wei Zhang,2026-03-17,09:00,17:00,8.0,RNA-seq 150PE,Confirmed
BK-011,Confocal Microscope,Dr. Marcus Brown,Marcus Brown,2026-03-17,10:30,13:00,2.5,Brain slice imaging,Cancelled
BK-012,Flow Cytometer,Dr. Emily Foster,Emily Foster,2026-03-17,14:00,16:00,2.0,Training session,Confirmed
BK-013,Confocal Microscope,Dr. Lisa Yamamoto,Yuki Sato,2026-03-18,09:00,12:00,3.0,Super-resolution,Confirmed
BK-014,qPCR System,Dr. Anika Patel,Raj Patel,2026-03-18,08:30,10:00,1.5,Copy number assay,Confirmed
BK-015,Flow Cytometer,Dr. Sarah Chen,Wei Zhang,2026-03-18,10:00,12:30,2.5,Apoptosis assay,Confirmed
BK-016,Sequencer,Dr. Marcus Brown,Marcus Brown,2026-03-18,09:00,17:00,8.0,Exome sequencing,Confirmed
BK-017,Confocal Microscope,Dr. James Rivera,Carlos Mendez,2026-03-18,11:00,14:00,3.0,Cleared tissue,Confirmed
BK-018,Flow Cytometer,Dr. Lisa Yamamoto,Kenji Tanaka,2026-03-18,12:30,14:00,1.5,Yeast cell cycle,Confirmed
BK-019,Confocal Microscope,Dr. Emily Foster,Emily Foster,2026-03-19,09:00,11:00,2.0,Immunofluorescence,Confirmed
BK-020,qPCR System,Dr. Sarah Chen,Wei Zhang,2026-03-19,09:00,10:30,1.5,Knockdown validation,Confirmed
BK-021,Flow Cytometer,Dr. Marcus Brown,Marcus Brown,2026-03-19,09:00,11:00,2.0,Compensation panel,Confirmed
BK-022,Sequencer,Dr. Anika Patel,Priya Singh,2026-03-19,09:00,17:00,8.0,ATAC-seq,Confirmed
BK-023,Confocal Microscope,Dr. Sarah Chen,Wei Zhang,2026-03-19,13:00,16:00,3.0,FRAP experiment,Confirmed
BK-024,Flow Cytometer,Dr. James Rivera,Carlos Mendez,2026-03-19,11:00,13:00,2.0,Cell sorting CD8+,Cancelled
BK-025,Confocal Microscope,Dr. Anika Patel,Raj Patel,2026-03-20,09:00,12:00,3.0,Calcium imaging,Confirmed
BK-026,qPCR System,Dr. Lisa Yamamoto,Yuki Sato,2026-03-20,08:00,09:30,1.5,16S validation,Confirmed
BK-027,Flow Cytometer,Dr. Emily Foster,Emily Foster,2026-03-20,10:00,12:00,2.0,Apoptosis panel,Confirmed
BK-028,Sequencer,Dr. James Rivera,Carlos Mendez,2026-03-20,09:00,17:00,8.0,ChIP-seq,Confirmed
BK-029,Confocal Microscope,Dr. Marcus Brown,Marcus Brown,2026-03-20,11:30,14:00,2.5,Fixed tissue IF,Confirmed
BK-030,Flow Cytometer,Dr. Sarah Chen,Wei Zhang,2026-03-20,13:00,15:30,2.5,Immune profiling,Confirmed
Note: BK-004 overlaps BK-001 on the Confocal (March 16, 11:00-12:00 overlap).
BK-017 overlaps BK-013 on the Confocal (March 18, 11:00-12:00 overlap).
BK-029 overlaps BK-025 on the Confocal (March 20, 11:30-12:00 overlap).
BK-011 and BK-024 are Cancelled.
3. SUMMARY CARDS (top of page, update on data load)
- Total bookings (count of Confirmed only)
- Total hours booked (sum of Duration_Hours for Confirmed)
- Conflicts detected (count of overlapping time ranges on the same instrument)
- Average utilization (total booked hours / total available hours across instruments,
assuming 12 hours available per instrument per day, 7 AM to 7 PM, weekdays only)
4. WEEKLY CALENDAR GRID
- Columns: Monday through Friday (use the week containing the dates in the data)
- Rows: hourly slots from 7:00 AM to 9:00 PM
- Each booking appears as a colored block spanning its time range
- Color code by instrument: Confocal #38bdf8, Flow Cytometer #10b981,
qPCR #f59e0b, Sequencer #8b5cf6
- Cancelled bookings shown with strikethrough text and 50% opacity
- Overlapping bookings highlighted with a red border (2px solid #ef4444)
and a small warning icon or "CONFLICT" badge
- Hovering a booking block shows a tooltip: Booking ID, PI, User, Project, Time range
- Add an instrument filter (checkboxes) above the calendar to show/hide instruments
5. UTILIZATION CHART (use Chart.js from CDN: https://cdn.jsdelivr.net/npm/chart.js)
- Horizontal bar chart showing utilization percentage per instrument
- Utilization = (total confirmed booked hours) / (available hours for the week)
- Available hours = 12 hours/day x 5 days = 60 hours per instrument per week
- Add a dashed vertical line at 80% as a "high demand" threshold
- Color each bar to match the instrument color from the calendar
- Show percentage labels on each bar
6. CONFLICT LOG
- A table below the chart listing every detected conflict
- Columns: Instrument, Date, Booking A (ID + PI + time), Booking B (ID + PI + time),
Overlap Duration (minutes)
- Sorted by date then instrument
- Red background tint on conflict rows
7. CANCELLED BOOKINGS SUMMARY
- A small card or table showing total cancelled hours per instrument
- Include percentage of total bookings that were cancelled
8. DESIGN
- Dark theme: background #0f172a, cards #1e293b, text #e2e8f0, accent #10b981
- Clean sans-serif font (Inter from Google Fonts CDN)
- Responsive layout: summary cards in a row, calendar full-width below,
chart and conflict log side by side (stacked on mobile)
- Calendar grid cells should have visible borders and time labels on the left axis
9. TECHNICAL
- Pure HTML/CSS/JS in one file, no build step
- Chart.js loaded from CDN
- Parse dates with native Date object, handle "HH:MM" time format
- Conflict detection: for each instrument, compare all confirmed booking pairs
and flag any where start_A < end_B AND start_B < end_A on the same date
- No data persistence — everything resets on page reload
💡Copy-paste ready

That entire block is the prompt. Paste it as-is. The sample data has 30 bookings across 5 days and 4 instruments, with 3 deliberate conflicts on the confocal and 2 cancelled bookings. This gives you enough variety to verify conflict detection, utilization math, and calendar rendering all work correctly.


What you get

After the LLM finishes (typically 60-90 seconds), you will have a single file: schedule-visualizer.html. Open it in any browser.

Expected output structure

schedule-visualizer.html (~700-1000 lines)

Click Load Example and you should see:

  1. Summary cards showing 28 confirmed bookings, approximately 90 total booked hours, 3 conflicts detected, and utilization percentages varying by instrument.
  2. Weekly calendar grid spanning March 16-20 with colored blocks. The confocal (blue) has the most bookings. Three conflict zones are visible on Monday, Wednesday, and Friday where confocal blocks overlap, marked with red borders.
  3. Utilization chart showing the sequencer at the highest utilization (8 hours every day = ~67% of available time), the confocal next, then flow cytometer and qPCR.
  4. Conflict log with 3 rows detailing each overlap on the confocal microscope, including the exact overlap duration in minutes.
  5. Cancelled bookings showing BK-011 (2.5 hours confocal) and BK-024 (2.0 hours flow cytometer) with a cancellation rate summary.
What about iLab or SUMS exports?

Booking exports from iLab and SUMS will have different column names than the sample data. Rename the columns to match (Instrument, Date, Start_Time, End_Time, Status) or add column-mapping as a customization below. Most exports include at least the instrument name, date, start time, end time, and status — the essential fields for this visualizer.

If something is off

ProblemFollow-up prompt
Calendar blocks are all stacked at the top of each dayThe booking blocks are not positioned vertically by time. Set each block's top position based on (start_hour - 7) * row_height and its height based on duration * row_height.
Conflicts are not detectedThe conflict detection is not finding overlapping bookings. Compare each pair of confirmed bookings on the same instrument and same date: a conflict exists when start_A < end_B AND start_B < end_A. Make sure you are comparing time values, not strings.
Utilization shows over 100%The utilization calculation is dividing by available hours per day instead of per week. Available hours per instrument per week = 12 hours/day x 5 days = 60 hours.

🔧

When Things Go Wrong

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

Symptom
All bookings appear on the same day column instead of spread across the week
Evidence
The calendar grid shows Monday through Friday headers, but every booking block is rendered under Monday. The other four day columns are empty.
What to ask the AI
"The date-to-column mapping is not working. Can you parse the Date field as a proper Date object and use getDay() to determine which column each booking belongs in? Make sure Monday is column 0 (not Sunday). Also check that the date comparison uses the date string directly, not a timezone-shifted Date object."
Symptom
Conflict detection finds zero conflicts even though the data has overlapping bookings
Evidence
The summary card shows 0 conflicts and the conflict log table is empty, but BK-001 and BK-004 clearly overlap on the Confocal from 11:00-12:00 on March 16.
What to ask the AI
"The conflict detection is not comparing time ranges correctly. Can you fix the overlap check? Two bookings on the same instrument and same date conflict when start_A < end_B AND start_B < end_A. Parse Start_Time and End_Time as minutes since midnight for comparison (e.g., '09:00' = 540, '12:00' = 720)."
Symptom
Cancelled bookings still appear as solid colored blocks on the calendar
Evidence
BK-011 and BK-024 look identical to confirmed bookings — same colors, no visual distinction
What to ask the AI
"Cancelled bookings should be visually distinct. Can you add 50% opacity, a strikethrough on the booking text, and a dashed border to any booking where Status is 'Cancelled'? Also exclude cancelled bookings from the utilization and conflict calculations."
Symptom
Chart.js utilization chart is blank or shows zero for all instruments
Evidence
The bar chart renders but all bars are at 0%. The summary cards show correct hour totals.
What to ask the AI
"The utilization chart is receiving zero values. Can you check that the utilization calculation divides total confirmed hours per instrument by 60 (12 hours/day x 5 days) and multiplies by 100 for the percentage? Also make sure Chart.js is loaded before the chart code runs — wrap chart creation in a window.onload handler."

How it works (the 2-minute explanation)

You do not need to read every line of the generated code, but here is the mental model:

  1. CSV parsing reads each line, splits by commas (respecting quoted fields), and maps each row to a booking object. Date and time fields are parsed into usable values. Cancelled bookings are flagged but kept in the dataset for display.
  2. Calendar grid construction creates a 5-column (Mon-Fri) by 14-row (7 AM - 9 PM) HTML table. Each booking is positioned absolutely within its day column, with the top offset calculated from the start time and the height from the duration. Instrument colors make it easy to see which resource each block represents.
  3. Conflict detection iterates through all pairs of confirmed bookings that share the same instrument and date. Two bookings conflict when their time ranges overlap — start_A < end_B AND start_B < end_A. The overlap duration is calculated as min(end_A, end_B) - max(start_A, start_B).
  4. Utilization calculation sums confirmed booking hours per instrument and divides by the total available hours for the week (60 hours per instrument, assuming 12 hours/day for 5 days). Chart.js renders this as a horizontal bar chart with percentage labels.
🔍For Facility Admins: What utilization numbers actually tell you

A utilization rate below 40% suggests an instrument may be underused — consider increasing marketing to other labs, offering training sessions, or adjusting the rate schedule. A rate above 80% means the instrument is approaching saturation and users may have trouble getting time slots. That is when you start the conversation about purchasing a second unit or extending operating hours. Neither number is inherently good or bad — context matters. A $2M sequencer at 50% utilization might be perfectly healthy if each run generates enough revenue. A $50K qPCR system at 90% utilization is a bottleneck that costs researchers time.


Customize it

The base visualizer covers weekly scheduling. Here are extensions that make it more powerful:

Add multi-week comparison

Add a "Week Navigation" bar with Previous and Next buttons. Parse all dates from the
uploaded CSV, group bookings by ISO week number, and let the user step through weeks.
Show the total hours and utilization for each week in a small sparkline below the
navigation buttons so the user can see demand trends across weeks.

Add maintenance window overlay

Add a "Maintenance Windows" section where the user can define recurring blocked times
per instrument (e.g., Confocal: every Tuesday 7:00-9:00 for alignment). Display these
on the calendar as gray hatched blocks. Subtract maintenance hours from the available
hours when calculating utilization. If a booking overlaps a maintenance window, flag it
in orange with a "MAINTENANCE CONFLICT" badge.

Export a utilization report

Add an "Export Report" button that opens a new window with a print-friendly layout on
white background. Include: report title with date range, all summary statistics,
a table of utilization per instrument, the complete conflict log, and cancellation
stats. Format for A4 paper with the facility name at the top and generation timestamp
at the bottom. White background, black text, no calendar grid (tables and stats only).

Add peak-hour heatmap

Add a "Peak Hours" tab that shows a heatmap grid: hours of the day (7 AM - 7 PM) on
the y-axis, days of the week on the x-axis. Each cell is colored by how many instruments
are booked during that hour-day combination, from white (0 bookings) to dark red (all
instruments booked). This shows at a glance when the facility is busiest. Add a tooltip
showing which instruments are booked in each cell.
The customization loop

Start with the working visualizer, then add features one prompt at a time. The maintenance window overlay is usually the highest-value addition because it gives a more accurate utilization number. The peak-hour heatmap is second — it helps you answer the question “when should we schedule training sessions?” (answer: whenever the heatmap is lightest).


Try it yourself

  1. Open your CLI tool in an empty folder.
  2. Paste the main prompt from above.
  3. Open the generated schedule-visualizer.html in your browser.
  4. Click Load Example to see the calendar grid populate with bookings and conflicts.
  5. Check the conflict log — it should show 3 overlapping pairs on the confocal microscope.
  6. Toggle the instrument filter checkboxes to show only one instrument at a time and verify the calendar updates.
  7. If your facility exports booking data as CSV from iLab, SUMS, or a shared calendar, upload a real file and see if the visualizer parses it correctly (you may need to rename columns to match).
  8. Pick one customization from the list above and add it.

If the visualizer works with your real scheduling data, bookmark it on the facility workstation. Run it at the start of each week to spot conflicts before they become problems and track utilization trends over time.


Key takeaways

  • One prompt, one tool: a detailed prompt with 30 rows of embedded booking data produces a working schedule visualizer in under 2 minutes.
  • Conflict detection is the core value — finding double-bookings before they cause problems is worth more than any chart or summary statistic.
  • Utilization rates need context — 50% utilization is not automatically bad, and 95% utilization means your users cannot get time. The visualizer gives you the numbers; you supply the facility knowledge.
  • This is a read-only tool by design — it does not replace your booking system, it supplements it. Upload an export, see the picture, make decisions.
  • The calendar grid pattern transfers everywhere — room scheduling, vehicle fleets, shared equipment pools. Any resource with time-based reservations can use this same visualization.

KNOWLEDGE CHECK

Your visualizer shows the confocal microscope at 85% utilization for the week while the qPCR system is at 18%. What is the most useful action to take with this information?

KNOWLEDGE CHECK

The conflict log shows three overlapping bookings on the confocal this week. Two are genuine double-bookings (scheduling errors) and one is a PI who intentionally booked overlapping time for two users on a dual-camera confocal. How should you handle this in the visualizer?


What’s next

You have now built tools spanning the full operational stack of a core facility — from sequence analysis and CRISPR guide design, through billing dashboards and QC pipelines, to this scheduling visualizer that closes the loop on instrument management. Each tool follows the same pattern: describe the data, specify the visualization, paste the prompt, and customize from there.

Here is what to do from here:

  • Revisit and customize. Go back to the tools most relevant to your specific facility. The customization prompts in each lesson are starting points — the real value comes when you adapt these tools to your actual data and workflows.
  • Share with your team. Every single-file HTML tool you built can be emailed to a colleague or dropped into a shared drive. Start with the one that solves the most immediate pain point for your group.
  • Continue building skills. The shared modules cover deeper topics — planning and orchestration (Module 10), debugging strategies (Module 10, Lesson 4), and deployment (Module 11) — that will make your tool-building faster and more reliable. You can also return to the Biotech Track to revisit any lesson.
  • Build something new. You have the pattern: describe the data format, specify the visualization, list the features, paste the prompt. The next tool you build will be one that does not exist in any lesson — because it solves a problem unique to your facility.
💬You are the expert

The AI handles the JavaScript. You handle the scheduling, the utilization targets, the maintenance windows, and the conversations with PIs about instrument access. That combination — domain expertise plus AI-augmented tooling — is what makes these tools useful rather than just technically impressive. Keep building.