<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Anki on Ghafoor's Personal Blog</title><link>http://ghafoorsblog.com/tags/anki/</link><description>Recent content in Anki on Ghafoor's Personal Blog</description><generator>Hugo</generator><language>en</language><managingEditor>noreply@example.com (AG Sayyed)</managingEditor><webMaster>noreply@example.com (AG Sayyed)</webMaster><copyright>Copyright © 2024-2026 AG Sayyed. All Rights Reserved.</copyright><atom:link href="http://ghafoorsblog.com/tags/anki/index.xml" rel="self" type="application/rss+xml"/><item><title>Anki Workflow Verification</title><link>http://ghafoorsblog.com/docs/anki/archive/anki_workflow_verification/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>noreply@example.com (AG Sayyed)</author><guid>http://ghafoorsblog.com/docs/anki/archive/anki_workflow_verification/</guid><description>&lt;h1 id="anki-workflow-verification"&gt;Anki Workflow Verification&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Date:&lt;/strong&gt; 2 May 2026&lt;br&gt;
&lt;strong&gt;Status:&lt;/strong&gt; ✅ Verified and Working&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="current-working-workflow"&gt;Current Working Workflow&lt;/h2&gt;
&lt;h3 id="1-card-creation-manual"&gt;1. Card Creation (Manual)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;JSON files are &lt;strong&gt;manually created&lt;/strong&gt; in: &lt;code&gt;data/course/{course}/{unit}/{module}/{lesson}/anki/*.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Each JSON contains metadata + flashcards array&lt;/li&gt;
&lt;li&gt;Example: &lt;code&gt;data/course/psychology-l2/01/01m/001/anki/01-counselling-skills.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2-card-generation-automatic"&gt;2. Card Generation (Automatic)&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;JSON File → apkg_generator.py → .apkg Package → Anki Desktop
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Key Scripts:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;apkg_generator.py&lt;/code&gt; - Main generator (reads JSON, creates APKG)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;generate_unit_apkg.py&lt;/code&gt; - Creates unit-level APKG files&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;rebuild_all_apkgs.py&lt;/code&gt; - Rebuilds all APKG files&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;NOT Used in Production:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>SCSS Styling System - Implementation Complete</title><link>http://ghafoorsblog.com/docs/anki/scss_implementation_summary/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>noreply@example.com (AG Sayyed)</author><guid>http://ghafoorsblog.com/docs/anki/scss_implementation_summary/</guid><description>&lt;h1 id="scss-styling-system---implementation-complete-"&gt;SCSS Styling System - Implementation Complete ✅&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Status&lt;/strong&gt;: Production Ready&lt;br&gt;
&lt;strong&gt;Date&lt;/strong&gt;: May 1, 2024&lt;br&gt;
&lt;strong&gt;Implementation Phase&lt;/strong&gt;: Styling Foundation &amp;amp; Integration&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Successfully implemented a modular, scalable SCSS styling system for Anki flashcards with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;80+ CSS variables&lt;/strong&gt; for consistent design tokens across all courses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reusable base components&lt;/strong&gt; shared by all courses&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Course-specific styling&lt;/strong&gt; for Psychology and DevOps (foundation for 50+ courses)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Compiled CSS&lt;/strong&gt; automatically injected into APKG files&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero breaking changes&lt;/strong&gt; to existing infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;h3 id="file-structure"&gt;File Structure&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;scripts/anki/styles/
├── _variables.scss # Global design tokens (colors, spacing, typography)
├── _base-components.scss # Reusable CSS classes for all card types
├── courses/
│ ├── psychology.scss # Psychology-specific color overrides
│ └── devops.scss # DevOps-specific styling
├── psychology.css # Compiled output (16 KB)
└── devops.css # Compiled output (17 KB)
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="design-flow"&gt;Design Flow&lt;/h3&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;User Card Data (JSON)
 ↓
metadata[&amp;#39;course&amp;#39;] = &amp;#39;psychology&amp;#39;
 ↓
APKGGenerator creates models
 ↓
_get_css(&amp;#39;psychology&amp;#39;)
 ↓
Load: scripts/anki/styles/psychology.css
 ↓
Inject CSS into Anki models
 ↓
Generate APKG with styled cards
&lt;/code&gt;&lt;/pre&gt;&lt;hr&gt;
&lt;h2 id="component-breakdown"&gt;Component Breakdown&lt;/h2&gt;
&lt;h3 id="1-global-variables-_variablesscss"&gt;1. Global Variables (&lt;code&gt;_variables.scss&lt;/code&gt;)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Color Palette:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Testing Guide</title><link>http://ghafoorsblog.com/docs/anki/testing_guide/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>noreply@example.com (AG Sayyed)</author><guid>http://ghafoorsblog.com/docs/anki/testing_guide/</guid><description>&lt;h1 id="scss-styling-system---complete-testing-guide"&gt;SCSS Styling System - Complete Testing Guide&lt;/h1&gt;
&lt;h1 id="this-script-shows-you-exactly-how-to-test-the-styling-integration"&gt;This script shows you exactly how to test the styling integration&lt;/h1&gt;
&lt;p&gt;cat &amp;laquo; &amp;lsquo;EOF&amp;rsquo;&lt;/p&gt;
&lt;p&gt;╔═══════════════════════════════════════════════════════════════════════════════╗
║ ║
║ SCSS STYLING SYSTEM - COMPLETE TESTING GUIDE ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════════╝&lt;/p&gt;
&lt;p&gt;📋 TESTING LEVELS
═══════════════════════════════════════════════════════════════════════════════&lt;/p&gt;
&lt;p&gt;Level 1: Unit Testing (Automated)
✓ Verify CSS files exist and compile
✓ Test CSS caching mechanism
✓ Test course detection from metadata
✓ Run: npm run test:anki&lt;/p&gt;
&lt;p&gt;Level 2: Integration Testing (Automated + Manual)
✓ Generate test APKGs with CSS
✓ Verify CSS embedded in APKG
✓ Test course-specific vs default CSS
✓ Run: npm run test:anki:verbose&lt;/p&gt;</description></item><item><title>Testing Quick Reference</title><link>http://ghafoorsblog.com/docs/anki/testing_quick_reference/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>noreply@example.com (AG Sayyed)</author><guid>http://ghafoorsblog.com/docs/anki/testing_quick_reference/</guid><description>&lt;h1 id="scss-styling-system---quick-reference-guide"&gt;SCSS Styling System - Quick Reference Guide&lt;/h1&gt;
&lt;h2 id="-quick-start-testing-5-minutes"&gt;🚀 Quick Start Testing (5 minutes)&lt;/h2&gt;
&lt;h3 id="1-verify-tests-pass"&gt;1. Verify Tests Pass&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;npm run test:anki
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ Expected: 52 tests passing&lt;/p&gt;
&lt;h3 id="2-verify-css-files-exist"&gt;2. Verify CSS Files Exist&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;1&lt;/span&gt;&lt;span class="cl"&gt;npm run anki:styles:list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ Expected: psychology.css (16 KB), devops.css (17 KB)&lt;/p&gt;
&lt;h3 id="3-generate-test-apkg-from-real-data"&gt;3. Generate Test APKG from Real Data&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 1&lt;/span&gt;&lt;span class="cl"&gt;conda activate ags-anki
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 2&lt;/span&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 3&lt;/span&gt;&lt;span class="cl"&gt;python3 &lt;span class="s"&gt;&amp;lt;&amp;lt; &amp;#39;PYTHON&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 4&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;import json
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 5&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;from pathlib import Path
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 6&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;from scripts.anki.apkg_generator import APKGGenerator
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 7&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;import tempfile, shutil
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 8&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt; 9&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Load real psychology data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;10&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;with open(&amp;#34;data/course/psychology-l2/01/01m/001/anki/01-counselling-skills.json&amp;#34;) as f:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;11&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; data = json.load(f)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;12&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;13&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Ensure course metadata exists
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;14&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;if &amp;#39;course&amp;#39; not in data[&amp;#39;metadata&amp;#39;]:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;15&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; data[&amp;#39;metadata&amp;#39;][&amp;#39;course&amp;#39;] = &amp;#39;psychology&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;16&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;17&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;# Generate APKG with styling
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;18&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;with tempfile.TemporaryDirectory() as tmpdir:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;19&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; gen = APKGGenerator(verbose=True)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;20&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; apkg = gen.generate_from_data(data, tmpdir, data[&amp;#39;metadata&amp;#39;].get(&amp;#39;deck_name&amp;#39;))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;21&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;22&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; # Copy to Desktop
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;23&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; shutil.copy(apkg, Path.home() / &amp;#34;Desktop&amp;#34; / &amp;#34;psychology-real-data.apkg&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;24&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; print(f\n✅ APKG copied to ~/Desktop/psychology-real-data.apkg&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;25&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;26&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; print(f&amp;#34; Size: {apkg.stat().st_size / 1024:.1f} KB (includes psychology CSS)&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="ln"&gt;27&lt;/span&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;PYTHON&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;✅ Expected:&lt;/p&gt;</description></item><item><title>Testing Verification</title><link>http://ghafoorsblog.com/docs/anki/testing_verification/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><author>noreply@example.com (AG Sayyed)</author><guid>http://ghafoorsblog.com/docs/anki/testing_verification/</guid><description>&lt;h1 id="testing-verification-placeholder"&gt;testing verification placeholder&lt;/h1&gt;
&lt;p&gt;#!/bin/bash&lt;/p&gt;
&lt;h1 id="quick-test-to-verify-css-is-in-apkg-sqlite-database"&gt;Quick test to verify CSS is in APKG SQLite database&lt;/h1&gt;
&lt;p&gt;cat &amp;laquo; &amp;lsquo;EOF&amp;rsquo;&lt;/p&gt;
&lt;p&gt;╔═══════════════════════════════════════════════════════════════════════════════╗
║ ║
║ HOW TO VERIFY CSS IS EMBEDDED IN YOUR APKG FILES ║
║ ║
╚═══════════════════════════════════════════════════════════════════════════════╝&lt;/p&gt;
&lt;p&gt;FILES TO TEST WITH
════════════════════════════════════════════════════════════════════════════════&lt;/p&gt;
&lt;p&gt;Run this command to generate test APKGs:&lt;/p&gt;
&lt;p&gt;python3 &amp;laquo; &amp;lsquo;PYTHON&amp;rsquo;
import json
import tempfile
from pathlib import Path
from scripts.anki.apkg_generator import APKGGenerator&lt;/p&gt;
&lt;h1 id="psychology-apkg"&gt;Psychology APKG&lt;/h1&gt;
&lt;p&gt;psy_data = {
&amp;ldquo;metadata&amp;rdquo;: {&amp;ldquo;course&amp;rdquo;: &amp;ldquo;psychology&amp;rdquo;, &amp;ldquo;deck_name&amp;rdquo;: &amp;ldquo;Psy-Test&amp;rdquo;, &amp;ldquo;unit&amp;rdquo;: &amp;ldquo;U1&amp;rdquo;, &amp;ldquo;module&amp;rdquo;: &amp;ldquo;M1&amp;rdquo;},
&amp;ldquo;flashcards&amp;rdquo;: [{&amp;ldquo;id&amp;rdquo;: &amp;ldquo;1&amp;rdquo;, &amp;ldquo;question&amp;rdquo;: &amp;ldquo;Q?&amp;rdquo;, &amp;ldquo;answer&amp;rdquo;: &amp;ldquo;A&amp;rdquo;, &amp;ldquo;tags&amp;rdquo;: [&amp;ldquo;test&amp;rdquo;], &amp;ldquo;difficulty&amp;rdquo;: 1}]
}&lt;/p&gt;</description></item></channel></rss>