A comprehensive Obsidian plugin for managing university courses and study materials with integrated scanning capabilities. Streamline your academic workflow with structured course creation, flexible archiving, and PDF document management.
Jinxx Tools helps students and academics organize their vault by:
- Creating structured courses with automatic folder hierarchies (Notes, Attachments, Scans)
- Managing course lifecycles with archive and restore functionality
- Scanning documents directly into course-specific PDF files
- Templating course notes with optional Templater integration
- Organizing notes with customizable subfolder layouts (Lectures, Exercises, etc.)
This plugin is ideal for university students who want to maintain a clean, organized vault with minimal manual file management.
Create and manage courses with a complete folder structure automatically generated for each course:
- Course Note: Markdown file in
University/Courses/ - Attachments Folder:
University/Attachments/<CourseName>/ - Notes Folder:
University/Notes/<CourseName>/(with optional subfolders) - Scans Folder:
University/Scans/<CourseName>/
Available Operations:
- Create: Add new courses with optional templates and subfolder layouts
- Delete: Remove courses permanently (with confirmation)
- Archive: Move courses to timestamped archive snapshots
- Restore: Recover courses from archives (with rename on conflict)
- Rename: Change course names and update all related folders
Scan physical documents directly into your vault with live monitoring and page rotation:
- Start a scan session to establish a baseline
- Scan documents using your physical scanner
- Live monitoring detects new PDFs automatically
- Preview & rotate pages before saving:
- Visual page grid with rotation indicators
- Rotate individual pages (90°, 180°, 270°)
- Keyboard shortcuts: R (rotate clockwise), Shift+R (counter-clockwise)
- Arrow keys for navigation
- Save merged PDF or append to existing scan
- Automatic archiving of original single-page PDFs (optional)
Additional Features:
- Rotate existing PDFs: Command to open and rotate pages in any PDF in your vault
- Stability checks ensure files are fully written before processing
- Subfolder support for organizing scans (e.g.,
Week1/,Lectures/) - Backup before append (optional)
- PDF merging powered by
pdf-lib(no external dependencies)
Use custom templates for course notes:
- Define multiple templates in settings
- Preview templates before applying
- Link templates to specific notes subfolder layouts
- Templater plugin integration for dynamic variables (automatic if installed)
Archive courses with timestamped snapshots:
- Format:
<CourseName>_YYYY-MM-DD_HH-MM-SS - Full structure preserved (Courses, Notes, Attachments, Scans)
- Restore with automatic conflict resolution
- Multiple snapshots per course supported
- Open Settings → Community plugins → Browse
- Search for "Jinxx Tools"
- Click Install then Enable
- Download
main.js,manifest.json, andstyles.cssfrom the latest release - Create folder:
<VaultFolder>/.obsidian/plugins/jinxx-tools/ - Copy the three files into the folder
- Reload Obsidian and enable the plugin in Settings → Community plugins
# Clone into your vault's plugins folder
cd "<YourVault>/.obsidian/plugins"
git clone https://github.com/CodingJinxx/jinxx-tools.git
cd jinxx-tools
# Install dependencies
npm install
# Build for development (watch mode)
npm run dev
# OR build for production
npm run buildThen reload Obsidian and enable the plugin.
- Open Settings → Jinxx Tools
- Configure Base Folders (defaults work for most users):
- University:
20_University - Templates:
90_Templates
- University:
- (Optional) Add Notes Subfolder Options for lecture layouts
- (Optional) Configure Course Templates
- (Optional) For scanning: Add Scanner Watch Folders (e.g.,
C:\Scans\Canon)
Option 1: Main Menu
- Run command:
Jinxx Tools: Manage Courses(Ctrl/Cmd+P) - Select ➕ Add Course
- Enter course name (e.g., "Calculus 101")
- (Optional) Choose a template
- (Optional) Select notes subfolder layout
Option 2: Direct Command
- Run command:
Jinxx Tools: Add Course - Follow prompts as above
Result: Creates:
20_University/
Courses/
Calculus 101.md
Notes/
Calculus 101/
Lecture/ (if subfolder layout selected)
Exercises/
Attachments/
Calculus 101/
Scans/
Calculus 101/
Interactive Menu:
- Run
Jinxx Tools: Manage Courses - Select a course from the list
- Choose action:
- 📄 Scan: Start scanning workflow for this course
- 🗑️ Delete: Delete permanently (with confirmation)
- 📦 Archive: Move to archive with timestamp
- ♻️ Restore: Restore from a previous archive snapshot
- ✏️ Rename: Rename course and all folders
Direct Commands (also available):
Jinxx Tools: Delete CourseJinxx Tools: Archive CourseJinxx Tools: Restore CourseJinxx Tools: Rename Course
Requirements:
- Scanner configured to save PDFs to a watch folder (e.g.,
C:\Scans\Canon) - Scanner creates day-based subfolders (e.g.,
2025_10_23) — auto-created if missing - Desktop platform (uses Node.js fs module)
Workflow:
-
Start Scan Session:
- Run
Jinxx Tools: Scanor select 📄 Scan from course menu - Select target course (or already selected if from course menu)
- Choose: 📄 Create New Scan or 📎 Append to Existing
- For new scans:
- Select subfolder (root, existing, or create new)
- Enter filename (e.g., "Lecture_Week1")
- Run
-
Live Monitoring Modal Opens:
- Shows real-time page count
- Detects new PDFs as they're scanned
- Click ✅ Preview & Save when done scanning
-
PDF Preview & Rotation:
- Page grid displays all scanned pages with rotation indicators
- Select a page (click or arrow keys)
- Rotate with buttons (↻ ↺) or keyboard (R / Shift+R)
- Modified pages show rotation angle (90°, 180°, 270°)
- Footer displays rotation count
- Click Save to merge with rotations, or Cancel to abort
-
Result:
- Merged PDF saved with rotations applied
- Original files archived if configured
- Success notice shows file count and path
Command: Jinxx Tools: Rotate pages in PDF
Fix orientation issues in any PDF already in your vault:
- Run the command
- Select a PDF from the suggester (shows all PDFs)
- PDF Preview modal opens with all pages
- Rotate pages as needed
- Choose:
- Overwrite: Update original file
- Save as new: Creates
{filename}-rotated.pdf
- Rotations applied immediately
Use Cases:
- Fix scanned pages placed upside-down in scanner
- Correct mixed landscape/portrait documents
- Adjust existing course materials for readability
Settings (optional):
- Stability Delay: Wait time between size checks (default: 1000ms)
- Stability Retries: Retries for locked files (default: 3)
- Archive After Merge: Move originals to archive folder
- Backup Before Append: Create backup before appending to existing PDF
Notes Subfolder Options:
- Go to Settings → Jinxx Tools → Notes Subfolder Options
- Click Edit (pencil icon) on an existing option, or Add New Notes Option
- Configure folder structure (e.g.,
Lecture,Exercises,Test) - Save
Course Templates:
- Go to Settings → Jinxx Tools → Course Templates
- Click Edit on an existing template, or Add New Template
- Set:
- Label: Display name (e.g., "Lecture Course")
- Template File: Path in Templates folder (e.g.,
course_template.md) - Notes Subfolder Option: Auto-apply a notes layout (optional)
- Save
Scanner Folders:
- Go to Settings → Jinxx Tools → Scans
- Click Add Scanner Folder
- Enter absolute path (e.g.,
C:\Scans\Canon) - Configure stability and archiving options as needed
- University: Root folder for courses (default:
20_University) - Templates: Folder for course templates (default:
90_Templates) - Home, Garden, Work, Books: Other organizational folders
Define nested folder structures for course notes. Each option has:
- Label: Display name shown in prompts
- Folders: Hierarchical structure (e.g.,
{ Lecture: {}, Exercises: {} })
Map templates to template files:
- Label: Display name
- Template File: Relative path in Templates folder
- Notes Subfolder Option: Auto-apply a subfolder layout (optional)
- Watch Folders: Array of absolute paths where scanner saves PDFs
- Stability Delay (ms): Wait time between file size checks (default: 1000)
- Stability Retries: Max retry attempts for locked files (default: 3)
- Keep Original Files: Don't delete single-page PDFs after merge
- Archive After Merge: Move originals to archive folder
- Archive Folder Path: Custom archive location (default:
{scanFolder}/archive) - Backup Before Append: Create backup before appending pages
- Error: "A course with that name already exists"
- Solution: Delete or rename the existing course first
- Check: Scanner is saving to configured watch folder
- Check: Day folder exists (e.g.,
2025_10_23) or plugin has permission to create it - Check: Files are PDFs (
.pdfextension) - Try: Restart scan session
- Cause: Scanner still writing file, or file locked by another program
- Solution: Wait a moment, then manually trigger detection, or exclude the file
- Check: Templater plugin is installed and enabled
- Check: Template file contains valid Templater syntax
- Note: Plugin attempts auto-rendering; check console (Ctrl+Shift+I) for details
- Check: Plugin has write permission to
.obsidian/plugins/jinxx-tools/data.json - Try: Reload Obsidian and verify settings
Jinxx Tools exposes a public API that allows other Obsidian plugins to programmatically access course configuration and data. This enables integration with your academic workflow tools.
// Access the API from another plugin
const jinxxTools = this.app.plugins.plugins['jinxx-tools'] as any;
if (jinxxTools?.api) {
// Get all courses
const courses = await jinxxTools.api.getCourses();
console.log('Available courses:', courses);
// Get course paths
const paths = jinxxTools.api.getCoursePaths('Calculus');
console.log('Notes folder:', paths.notesFolder);
// Create a file in the course notes folder
const notePath = `${paths.notesFolder}/My Note.md`;
await this.app.vault.create(notePath, '# My Note');
}getBaseFolders(): Get university folder configurationgetCourses(): List all course namescourseExists(courseName): Check if a course existsgetCoursePath(courseName): Get path to course foldergetCoursePaths(courseName): Get all paths (notes, attachments, scans, course file)getAllBaseFolders(): Get all configured base foldersisScanningEnabled(): Check if scanning is configuredgetScanWatchFolders(): Get scanner watch folder paths
For complete API reference, usage examples, and integration patterns, see docs/API.md.
- Create files in course folders: Automatically place generated notes in the right location
- Display course information: Build dashboards or course overviews
- Integrate with scanning: Automate post-scan workflows
- Course-aware tools: Build plugins that understand your course structure
Note: This is a desktop-only plugin. The API is only available on desktop platforms.
For detailed technical documentation, architecture overview, and extension guidelines, see docs/project_reference.md.
# Development (watch mode)
npm run dev
# Production build
npm run build
# Deploy to vault (configured in deploy.mjs)
npm run deploy
# Lint
npm run lint
# Format
npm run formatjinxx-tools/
├── main.ts # Plugin entry, lifecycle, command registration
├── manifest.json # Plugin metadata
├── package.json # Dependencies and scripts
├── src/
│ ├── services/
│ │ ├── ConfigService.ts # Settings read/write
│ │ ├── CourseService.ts # Course operations (CRUD)
│ │ └── ScanService.ts # PDF scanning and merging
│ ├── settings/
│ │ └── SettingTab.ts # Plugin settings UI
│ ├── ui/
│ │ ├── SimpleSuggester.ts # Fuzzy search modal wrapper
│ │ ├── PromptModal.ts # Text input modal
│ │ ├── YesNoModal.ts # Confirmation modal
│ │ ├── LiveScanMonitorModal.ts # Live PDF scanning UI
│ │ └── ... # Other modals
│ └── utils/
│ └── file.ts # File operations (ensureFolder, delete, etc.)
└── docs/ # Documentation
See docs/project_reference.md for comprehensive test scenarios.
Quick Smoke Test:
- Create a course → Verify folders
- Archive the course → Verify archive snapshot
- Restore the course → Verify restoration
- Delete the course → Verify deletion
This plugin is a complete migration of the jinxx-quickadd.js QuickAdd script with feature parity and improvements:
- Migrated: All course management functions
- Added: Live scanning workflow with UI
- Added: Full settings UI (no manual JSON editing)
- Added: Direct commands for all operations
- Improved: Error handling and user feedback
- Improved: Archive/restore conflict resolution
- OCR integration for scanned documents
- Bulk operations (archive/delete multiple courses)
- Course statistics and analytics
- Export/import settings
- Mobile support (limited features)
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: docs/
Contributions welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes with tests
- Submit a pull request
See AGENTS.md for coding guidelines.
MIT License - see LICENSE for details.
Jay Leimer (@CodingJinxx)
If you find this plugin helpful, consider buying me a coffee ☕
- Built on the Obsidian API
- PDF merging powered by pdf-lib
- Inspired by academic note-taking workflows