Open PowerShell or Command Prompt (not as admin — just normal):
ollama --version
You should see something like ollama version 0.x.x. If you get "not recognized," restart your terminal or reboot.
ollama list
This should return an empty list (no models yet). The important thing is it runs without errors. Ollama auto-detects your 3070 and will use it for inference.
ollama pull llama3.1:8b
Downloads ~4.7GB. Q4_0 quantization by default — fits your 8GB VRAM cleanly. Wait for it to finish.
ollama pull mistral:7b
Downloads ~4.1GB. You don't need this immediately, but having it ready means you can run two-model comparison whenever you want.
ollama list
You should see both models listed with their sizes.
ollama run llama3.1:8b "What is a d20?"
You should get a fast, coherent response about twenty-sided dice. If this works, your GPU inference is running. Type /bye to exit the interactive session if it drops you into one.
ollama run llama3.1:8b
This opens an interactive session. Paste this:
Extract the following rolls into CSV format with columns:
pc, roll_type, die, result, modifier, total, target_ac, hit_flag
Session transcript excerpt:
Feliciano attacks Enforcer A with his longsword. He rolls a 14,
plus 4 to hit, total 18 against AC 14. That's a hit. He rolls
damage: 1d8+2, gets a 6, total 8 slashing damage.
Hillie fires Eldritch Blast at the Archer. She rolls a 7, plus 4
to hit, total 11 against AC 12. Miss — the blast scorches the scaffolding.
Feliciano makes a Constitution saving throw against poison. He rolls
a 3, plus 2, total 5 against DC 13. Fail.
Output CSV only, no explanation.
You should get clean CSV output. If it does, your parsing pipeline works. Type /bye to exit.
mkdir C:\BlindSpot
mkdir C:\BlindSpot\prompts
mkdir C:\BlindSpot\data
mkdir C:\BlindSpot\briefs
Create a file at C:\BlindSpot\prompts\parse_rolls.txt with this content:
SYSTEM: You are a D&D session transcript parser. Your job is to extract
structured data from session transcripts. Output ONLY CSV data, no
explanation, no markdown formatting, no commentary.
SCHEMA — ROLL LOG:
pc,roll_type,die,result,modifier,total,target,hit_flag,session,scene
FIELD DEFINITIONS:
- pc: Character name (e.g., Feliciano, Hillie)
- roll_type: attack, save, check, damage, initiative
- die: d20, d8, d10, d6, d4, d12, d100
- result: Natural die result (before modifiers)
- modifier: Bonus/penalty applied
- total: result + modifier
- target: AC or DC the roll was against (0 if unknown)
- hit_flag: 1 = success/hit, 0 = fail/miss, -1 = unknown
- session: Session number (e.g., S01)
- scene: Scene number within session (e.g., 1, 2, 3)
RULES:
- Extract EVERY roll mentioned in the transcript
- If a roll result is not explicitly stated, skip it
- If a modifier is not stated, use 0
- If a target AC/DC is not stated, use 0
- Natural 1 is always a miss (hit_flag = 0)
- Natural 20 is always a hit (hit_flag = 1)
- Damage rolls: hit_flag = -1 (not applicable)
- Do not invent or infer rolls that aren't in the text
- Output the CSV header row first, then data rows
USER: Here is the transcript for session [SESSION_NUMBER]:
[PASTE TRANSCRIPT HERE]
Create a file at C:\BlindSpot\prompts\campaign_brief.txt with this content:
SYSTEM: You are a Campaign Intelligence Analyst for a D&D 5e campaign.
You read structured campaign metrics and produce a concise pre-session
briefing for the DM. Your tone is direct, analytical, and actionable —
like an audit findings report, not a creative writing piece.
OUTPUT FORMAT:
1. CAMPAIGN HEALTH SCORE (0-100, with 1-line justification)
2. TOP 3 PREP PRIORITIES (numbered, 2-3 sentences each)
3. FLAGS (bullet list of active concerns with data citations)
4. RECOMMENDATIONS (2-3 specific, actionable suggestions)
RULES:
- Cite specific numbers from the data (don't generalize)
- If spotlight split exceeds 60/40, flag it
- If any quest has been active 4+ sessions with no progress, flag it
- If any PC's d20 average is below 9.0 over 30+ rolls, flag it
- If any faction clock is at 75%+ capacity, flag it
- If resource usage (spell slots, abilities) is below 50%, flag it
- Keep the entire brief under 400 words
- Do not invent data points not provided in the input
- End with "Next session focus:" and a single sentence
USER: Here are the campaign metrics for pre-session [SESSION_NUMBER] prep:
CAMPAIGN: [CAMPAIGN NAME]
SESSIONS PLAYED: [N]
TOTAL ROLLS: [N]
PC STATS:
[paste PC performance summary]
QUEST STATUS:
[paste quest tracker summary]
FACTION STATE:
[paste faction heat/favor summary]
RESOURCE USAGE:
[paste resource burn rates]
DICE SUMMARY:
[paste dice averages and distribution notes]
SPOTLIGHT:
[paste actions-per-PC breakdown]
# Option A: Interactive (paste the transcript in)
ollama run llama3.1:8b
# Then paste your parse_rolls prompt with the transcript
# Option B: Pipe a file (if you saved the full prompt + transcript)
Get-Content C:\BlindSpot\data\session01_parse_input.txt | ollama run llama3.1:8b
C:\BlindSpot\data\session01_rolls.csvOnce you have 2-3 sessions of data in the engine and dashboard metrics:
ollama run llama3.1:8b < C:\BlindSpot\data\session03_brief_input.txt > C:\BlindSpot\briefs\session04_brief.txt
ollama run mistral:7b < C:\BlindSpot\data\session03_brief_input.txt > C:\BlindSpot\briefs\session04_brief_mistral.txt
Open both briefs side by side. Where they agree = high confidence. Where they diverge = DM judgment call. You don't need automation for this yet — eyeball comparison is fine for the first few sessions.
C:\Users\[you]\AppData\Local\Programs\Ollama is in your PATH.ollama ps while a model is loaded to see where it's running. Restart the Ollama service from the system tray.ollama pull phi3:medium — Phi-3 Medium 14B, partially offloads to CPU, slower but more capableollama pull gemma2:9b — Google's Gemma 2 9B, good at structured tasksollama pull llama3.2:3b — smaller, faster, less capable, good for simple parsing