Teleprompter Plus
pendingby Americo
Scroll notes as a teleprompter with mobile remote control, Stream Deck integration, countdown timer, and voice tracking.
Teleprompter Plus
Professional teleprompter for Obsidian with Stream Deck integration
Perfect for presentations, video recording, podcasts, speeches, and content creation.
š§ Quick Navigation
Screenshots ⢠Features ⢠Installation ⢠Quick Start ⢠Keyboard Shortcuts ⢠Stream Deck ⢠Settings ⢠Development
šø Screenshots
Main Teleprompter Interface
Clean, distraction-free teleprompter with eyeline guide and hierarchical navigation panel. Features include adjustable speed, font size controls, and real-time position tracking.
Mobile Remote Control (New in v0.9.0!)
Control your teleprompter from any device on your network - phone, tablet, or second computer. Touch-friendly interface with full playback control and section navigation.
Stream Deck Integration
Professional hardware control with 55+ actions. Real-time state synchronization, visual feedback, and complete teleprompter control at your fingertips.
Settings Panel
Comprehensive customization options including appearance, playback, navigation, WebSocket server, and advanced settings.
šļø Architecture Overview
flowchart TB
subgraph Obsidian["Obsidian App"]
Plugin["Teleprompter Plus Plugin"]
View["Teleprompter View"]
Settings["Settings Manager"]
Plugin --> View
Plugin --> Settings
end
subgraph Core["Core Components"]
Svelte["Svelte 5 UI\n(TeleprompterApp.svelte)"]
Markdown["Markdown Renderer\n(marked.js + highlight.js)"]
State["State Management\n($state, $effect)"]
View --> Svelte
Svelte --> Markdown
Svelte --> State
end
subgraph Server["WebSocket Server"]
WS["ws://127.0.0.1:8765"]
Commands["Command Router"]
Broadcast["State Broadcaster"]
WS --> Commands
WS --> Broadcast
end
subgraph Clients["External Clients"]
StreamDeck["Stream Deck\n(55+ actions)"]
Mobile["Mobile Remote\n(Web Interface)"]
Custom["Custom Scripts\n(Bun, Node.js, etc.)"]
end
subgraph Features["Key Features"]
AutoScroll["Auto-Scroll Engine\n(requestAnimationFrame)"]
Navigation["Header Navigation\n(Hierarchical Tree)"]
Minimap["Minimap\n(Abstract Scrollbar)"]
Flip["Flip Modes\n(H/V Mirror)"]
TTS["Text-to-Speech\n(Kokoro MLX / macOS Say)"]
end
Plugin --> WS
Svelte --> AutoScroll
Svelte --> Navigation
Svelte --> Minimap
Svelte --> Flip
Svelte --> TTS
StreamDeck <--> WS
Mobile <--> WS
Custom <--> WS
Broadcast --> StreamDeck
Broadcast --> Mobile
Broadcast --> Custom
⨠Features
š Core Teleprompter Features
- Auto-scrolling - Smooth, variable-speed scrolling with precise control
- Play/Pause controls - One-click playback with optional countdown timer
- Variable speed - Adjust scrolling speed on the fly (configurable 0.5-10 range)
- Dynamic font sizing - Real-time text size adjustment (12-72px)
- Reset to top - Instantly jump back to the beginning
- Countdown timer - Optional countdown before auto-scroll starts
- Manual scrolling - Scroll up/down with customizable amounts
- Flip mode - Mirror text horizontally or vertically for teleprompter rigs
šØ Display & Appearance
- Full-screen mode - Distraction-free, immersive view
- Keep awake - Prevent screen from sleeping during playback
- Pin window - Keep teleprompter always on top (macOS/Windows)
- Clean interface - Focus on your content with minimal UI
- Theme integration - Automatically adapts to your Obsidian theme
- Resizable panels - Customize navigation panel width
- Line height control - Adjust spacing for optimal readability
šŗļø Advanced Navigation
- Hierarchical header navigation - Collapsible tree view of document structure
- Active section highlighting - Visual indicator of current position
- One-click section jumping - Jump to any header instantly
- Real-time position tracking - Always know where you are in the document
- Abstract scrollbar minimap - Visual overview of document with position markers
- Previous/Next section - Navigate sequentially through headers
- Scroll sync - Editor and teleprompter stay in sync
š® Stream Deck Integration (55+ Actions)
- External hardware control - Full control via Stream Deck
- Real-time state sync - Bidirectional communication with visual feedback
- 8 action categories - Playback, Speed, Font, Navigation, Display, Utility, Countdown, Flip
- WebSocket API - Local server on port 8765
- Auto-reconnection - Resilient connection handling
- State indicators - Visual feedback on Stream Deck buttons
āØļø Complete Keyboard Control (25+ Commands)
- Playback commands - Play, pause, toggle
- Speed control - Increase, decrease, set specific speed
- Font control - Increase, decrease, reset size
- Navigation - Next/previous section, jump to top
- Display - Fullscreen, keep awake, pin window, minimap
- Utility - Scroll sync, countdown, flip modes
- Customizable hotkeys - Set your own keyboard shortcuts
š Full Markdown Support
- Complete Obsidian syntax - All Markdown features supported
- Images - Display embedded images inline
- Code blocks - Syntax highlighted code with highlight.js
- Tables - Formatted tables
- Task lists - Checkboxes and tasks
- YAML frontmatter - Automatically hidden from display
- Math - LaTeX equations
- Callouts - Obsidian callout boxes
- Links - Both internal and external links
- Diagram placeholders - Mermaid, PlantUML, and other diagrams shown as clean placeholders
š Text-to-Speech (TTS)
- Kokoro neural TTS - High-quality neural voices via MLX on Apple Silicon (setup guide)
- 22 voice presets - Male, female, American, and British English voices
- Audio-synced scrolling - Teleprompter scrolls in sync with spoken audio
- Sentence highlighting - Current sentence highlighted as it's read
- Citation resolution -
[@ries2011]spoken as "(Ries, 2011)" using .bib files - Multiple engines - Kokoro (best), macOS Say, Web Speech API (fallback)
- Pause/Resume - Full playback control with toolbar and keyboard
š v0.9.0 Features
- Speed presets - Cycle through 6 preset speeds (0.5x, 1x, 1.5x, 2x, 3x, 5x)
- Custom hotkeys - Define your own keyboard shortcuts for 12+ actions
- Double-click to edit - Click text in teleprompter to jump to that line in editor
- Text alignment - Cycle through left, center, right, and RTL alignment
- Progress indicator styles - Choose between progress bar, scrollbar, or none
- Eyeline indicator - Draggable reading position guide
- Diagram placeholders - Clean "š Flowchart" style placeholders for Mermaid diagrams
ā” Performance Optimizations
- Debounced scroll handling - Smooth performance with large documents
- Memoized markdown rendering - Skip re-rendering unchanged content
- requestAnimationFrame scrolling - Consistent 60fps smooth scrolling
- Passive event listeners - Improved scroll performance
- Batch DOM operations - Efficient header registration
š ļø Advanced Settings
- Scroll speed configuration - Set default, min, max speeds
- Speed increment - Customize adjustment amounts
- Navigation preferences - Default width, remember state
- Auto-start options - Automatically begin playing
- Debug mode - Verbose logging for troubleshooting
- WebSocket configuration - Port, host, auto-start settings
š¦ Installation
Method 1: Manual Installation (Recommended)
-
Download the latest release
- Go to the Releases page
- Download
teleprompter-plus.zip
-
Extract to plugins folder
- Navigate to your vault's
.obsidian/plugins/directory - Create a new folder called
teleprompter-plus - Unzip the contents into this folder
- You should have these 3 files inside:
<vault>/.obsidian/plugins/teleprompter-plus/ āāā main.js āāā manifest.json āāā styles.css
- Navigate to your vault's
-
Enable the plugin
- Open Obsidian
- Go to Settings ā Community Plugins
- Click "Reload plugins" if necessary
- Find "Teleprompter Plus" and enable it
Method 2: Build from Source
# 1. Clone the repository
git clone https://github.com/JuracyAmerico/obsidian-teleprompter-plus.git
cd obsidian-teleprompter-plus
# 2. Install dependencies
bun install
# 3. Build the plugin
bun run build
# 4. Copy to your vault's plugins folder
mkdir -p "<vault>/.obsidian/plugins/teleprompter-plus"
cp dist/main.js dist/styles.css manifest.json "<vault>/.obsidian/plugins/teleprompter-plus/"
# 5. Reload Obsidian and enable the plugin
š Quick Start
Basic Usage
-
Open Teleprompter
- Click the teleprompter icon in the left ribbon, or
- Use Command Palette:
Cmd/Ctrl + Pā "Open Teleprompter Plus"
-
Load a Note
- Open any note in Obsidian
- The teleprompter automatically displays the active note
- Content updates in real-time as you edit
-
Control Playback
- Click
Play to start auto-scrolling
- Use +/- buttons to adjust speed
- Click
Reset to return to top
- Press
Pause to stop scrolling
- Click
-
Adjust Appearance
- Use
Aa+/- buttons to change font size
- Click fullscreen icon for distraction-free mode
- Toggle navigation panel to see document structure
- Use
Navigation Panel
The navigation panel shows a hierarchical tree of all headers in your document:
- Toggle: Click the menu icon
- Navigate: Click any header to jump to that section
- Collapse/Expand: Click arrows to show/hide nested sections
- Active highlighting: Current section is highlighted in blue
- Resize: Drag the right edge to adjust panel width
Minimap (Abstract Scrollbar)
When navigation panel is hidden, a minimap appears on the right:
- Position indicator: Blue viewport shows current scroll position
- Header markers: Colored bars indicate section positions
- Click to jump: Click anywhere on minimap to jump to that position
- Hover to expand: Minimap widens on hover for easier interaction
āØļø Keyboard Shortcuts
All commands are available in the Command Palette (Cmd/Ctrl + P). Set custom hotkeys in Settings ā Hotkeys ā Teleprompter Plus.
Playback Control
| Command | Description |
|---|---|
| Toggle Play/Pause | Start or stop auto-scrolling |
| Play | Start auto-scrolling |
| Pause | Stop auto-scrolling |
| Reset to Top | Jump to beginning of document |
Speed Control
| Command | Description |
|---|---|
| Increase Scroll Speed | Speed up scrolling (uses speed increment setting) |
| Decrease Scroll Speed | Slow down scrolling |
| Set Scroll Speed | Set specific speed value |
Font Size Control
| Command | Description |
|---|---|
| Increase Font Size | Make text larger (+2px) |
| Decrease Font Size | Make text smaller (-2px) |
| Reset Font Size | Reset to default (24px) |
Navigation
| Command | Description |
|---|---|
| Next Section | Jump to next header |
| Previous Section | Jump to previous header |
| Toggle Navigation Panel | Show/hide navigation sidebar |
Display Controls
| Command | Description |
|---|---|
| Toggle Full-Screen Mode | Enter/exit fullscreen |
| Toggle Keep Awake | Prevent screen from sleeping |
| Toggle Pin Window | Keep window always on top (macOS/Windows) |
| Toggle Minimap | Show/hide abstract scrollbar |
Advanced Controls
| Command | Description |
|---|---|
| Toggle Scroll Sync | Sync teleprompter with editor |
| Start Countdown | Begin countdown timer |
| Cancel Countdown | Stop countdown timer |
| Toggle Flip Horizontal | Mirror text horizontally |
| Toggle Flip Vertical | Flip text vertically |
| Toggle Flip Both | Flip horizontally and vertically |
Utility Commands
| Command | Description |
|---|---|
| Open Teleprompter Plus | Open teleprompter view |
| Show WebSocket Server Info | Display connection info and status |
Tip: To avoid conflicts with Obsidian's zoom shortcuts, font size commands don't have default hotkeys. Set custom shortcuts in Settings ā Hotkeys.
š® Stream Deck Integration
Overview
The plugin includes a built-in WebSocket server that enables full control via Elgato Stream Deck. Control playback, speed, font size, navigation, and all features using hardware buttons.
WebSocket Server: ws://127.0.0.1:8765
55+ Available Actions
1. Playback Control (8 actions)
- Play/Pause - Toggle playback with state indicator
- Play - Start scrolling
- Pause - Stop scrolling
- Reset to Top - Jump to beginning
- Scroll Up - Manual scroll up
- Scroll Down - Manual scroll down
- Set Scroll Amount - Configure manual scroll distance
- Get State - Request current state update
2. Speed Control (5 actions)
- Speed Up - Increase scroll speed
- Speed Down - Decrease scroll speed
- Set Speed - Set specific speed value
- Speed to Min - Set to minimum speed
- Speed to Max - Set to maximum speed
3. Font Size Control (5 actions)
- Font Size Up - Increase text size
- Font Size Down - Decrease text size
- Set Font Size - Set specific size
- Font Size to Min - Set to 12px
- Font Size to Max - Set to 72px
4. Navigation (7 actions)
- Next Section - Jump to next header
- Previous Section - Jump to previous header
- Jump to Section - Jump to specific header by index
- First Section - Jump to first header
- Last Section - Jump to last header
- Toggle Navigation - Show/hide navigation panel
- Toggle Minimap - Show/hide minimap
5. Display (10 actions)
- Toggle Fullscreen - Enter/exit fullscreen
- Enter Fullscreen - Go fullscreen
- Exit Fullscreen - Leave fullscreen
- Toggle Keep Awake - Prevent sleep
- Enable Keep Awake - Turn on keep awake
- Disable Keep Awake - Turn off keep awake
- Toggle Pin Window - Keep on top
- Pin Window - Enable always on top
- Unpin Window - Disable always on top
- Toggle Scroll Sync - Sync with editor
6. Countdown Timer (5 actions)
- Start Countdown - Begin countdown
- Cancel Countdown - Stop countdown
- Set Countdown - Set countdown duration (seconds)
- Countdown 3s - Quick 3-second countdown
- Countdown 5s - Quick 5-second countdown
7. Flip Controls (8 actions)
- Toggle Flip Horizontal - Mirror horizontally
- Toggle Flip Vertical - Flip vertically
- Toggle Flip Both - Flip both axes
- Enable Flip Horizontal - Turn on horizontal flip
- Disable Flip Horizontal - Turn off horizontal flip
- Enable Flip Vertical - Turn on vertical flip
- Disable Flip Vertical - Turn off vertical flip
- Reset Flips - Disable all flips
8. Section Management (7+ actions)
- Expand All Sections - Open all navigation items
- Collapse All Sections - Close all navigation items
- Expand Section - Open specific section
- Collapse Section - Close specific section
- Toggle Section - Expand/collapse section
- Eyeline - Custom position marker
- Bookmarks - Save and recall positions
WebSocket API
Command Format
{
"command": "command-name",
"value": 123 // Optional, for commands that take parameters
}
State Updates (Broadcasted)
{
"type": "state",
"data": {
"isPlaying": true,
"speed": 2.5,
"fontSize": 24,
"scrollPosition": 1200,
"maxScroll": 3000,
"scrollPercentage": 40,
"currentNote": "my-presentation.md",
"currentNoteTitle": "My Presentation",
"headers": [
{ "id": "header-0", "text": "Introduction", "level": 1 },
{ "id": "header-1", "text": "Background", "level": 2 }
],
"currentHeaderIndex": 0,
"navigationVisible": false,
"minimapVisible": true,
"isFullscreen": false,
"keepAwake": false,
"isPinned": false,
"scrollSyncEnabled": false,
"isCountingDown": false,
"countdownSeconds": 0,
"flipHorizontal": false,
"flipVertical": false,
"timestamp": 1697832000000
}
}
Example Commands
// Toggle play/pause
ws.send(JSON.stringify({ command: "toggle-play" }))
// Set speed to 3
ws.send(JSON.stringify({ command: "set-speed", value: 3 }))
// Jump to second header (index 1)
ws.send(JSON.stringify({ command: "jump-to-header", value: 1 }))
// Request state update
ws.send(JSON.stringify({ command: "get-state" }))
Setting Up Stream Deck
-
Install Stream Deck Software
- Download from Elgato's website
- Install and launch Stream Deck app
-
Install Teleprompter Plus Plugin
- Coming soon: Official Stream Deck plugin in Elgato Marketplace
- Manual installation: Stream Deck Plugin Repository
-
Configure Actions
- Drag actions from Teleprompter Plus category to your Stream Deck
- Configure each action's settings (e.g., speed values, section indices)
- Test connection: "Get State" action should show current teleprompter state
-
Verify Connection
- Open Teleprompter Plus in Obsidian
- Check for WebSocket server notification
- Use Command Palette: "Show WebSocket Server Info"
- Stream Deck should show "Connected" status
Custom Control Scripts
You can also control the teleprompter from custom scripts:
// Bun/TypeScript example (save as control.ts, run with: bun control.ts)
const ws = new WebSocket('ws://127.0.0.1:8765')
ws.onopen = () => {
// Start playing
ws.send(JSON.stringify({ command: 'play' }))
// Speed up after 5 seconds
setTimeout(() => {
ws.send(JSON.stringify({ command: 'set-speed', value: 5 }))
}, 5000)
}
ws.onmessage = (event) => {
const message = JSON.parse(event.data as string)
if (message.type === 'state') {
console.log('Current speed:', message.data.speed)
console.log('Scroll position:', message.data.scrollPercentage + '%')
}
}
āļø Settings
Access settings via Settings ā Teleprompter Plus.
Appearance
| Setting | Description | Default |
|---|---|---|
| Font Size | Base text size for teleprompter | 24px (12-72px) |
| Line Height | Spacing between lines | 1.6 (1.0-3.0) |
Playback
| Setting | Description | Default |
|---|---|---|
| Default Scroll Speed | Initial speed when opening teleprompter | 2 (0.5-10) |
| Minimum Scroll Speed | Lowest allowed speed | 0.5 |
| Maximum Scroll Speed | Highest allowed speed | 10 |
| Speed Increment | Amount speed changes per +/- press | 0.5 (0.1-2) |
| Countdown Duration | Seconds to count down before playing | 0 (disabled) |
Navigation
| Setting | Description | Default |
|---|---|---|
| Default Navigation Width | Initial width of navigation panel | 250px |
| Remember Navigation State | Persist panel open/closed state | Yes |
| Show Active Section Highlight | Highlight current section in navigation | Yes |
| Show Minimap | Display abstract scrollbar when nav hidden | Yes |
Behavior
| Setting | Description | Default |
|---|---|---|
| Auto-Start Playing | Begin playing immediately on open | No |
| Scroll Sync with Editor | Keep editor and teleprompter in sync | No |
WebSocket Server
| Setting | Description | Default |
|---|---|---|
| Auto-Start Server | Start server when Obsidian launches | Yes |
| WebSocket Port | Port for external connections | 8765 |
| WebSocket Host | Host address (localhost for security) | 127.0.0.1 |
| Show Connection Notifications | Display server start/stop messages | Yes |
| Server Status | Real-time connection info | (read-only) |
Developer
| Setting | Description | Default |
|---|---|---|
| Debug Mode | Enable verbose console logging | No |
Note: Debug mode requires reloading Obsidian to take effect. Use for troubleshooting only, as it generates significant console output.
š” Use Cases
š¹ Video Recording
Perfect for creating YouTube videos, tutorials, or presentations:
- Load your script into teleprompter
- Set comfortable reading speed
- Use Stream Deck for hands-free control
- Keep eye contact with camera while reading
š¤ Public Speaking
Deliver confident speeches and presentations:
- Structure your talk with headers for easy navigation
- Jump between sections for Q&A
- Practice with variable speeds
- Use countdown timer before starting
šļø Podcasting
Stay on track during podcast recordings:
- Load show notes and talking points
- Navigate sections for segment transitions
- Use minimap for quick position checks
- Sync with editor for real-time note taking
š Content Creation
Write and review long-form content:
- Review articles at reading speed
- Check flow and pacing
- Use navigation for quick section access
- Flip mode for in-person teleprompter rigs
š Educational Content
Create lessons and lectures:
- Organize content with hierarchical headers
- Jump between concepts easily
- Use scroll sync for live editing
- Full markdown support for code examples
š§ Troubleshooting
WebSocket Server Issues
Problem: Server won't start / "Port already in use" error
Solutions:
- Check if another Obsidian instance is running
- Close other applications using port 8765
- Change port in Settings ā Teleprompter Plus ā WebSocket Port
- Restart Obsidian after changing settings
Problem: Stream Deck not connecting
Solutions:
- Verify Obsidian is running with plugin enabled
- Check WebSocket server status: Command Palette ā "Show WebSocket Server Info"
- Ensure Stream Deck plugin is installed and configured correctly
- Try restarting WebSocket server from settings
- Check firewall settings (allow localhost connections)
Content Issues
Problem: Content not updating when switching notes
Solutions:
- Close and reopen teleprompter view
- Ensure note is active (clicked in editor)
- Check console for errors:
Cmd/Ctrl + Shift + I - Enable Debug Mode in settings for detailed logging
Problem: Images not displaying
Solutions:
- Use proper Markdown syntax:
 - Ensure images are in vault or use absolute paths
- Check image file exists and is accessible
- Verify image format is supported (PNG, JPG, GIF, SVG)
Problem: YAML frontmatter showing in teleprompter
Solutions:
- Plugin automatically strips frontmatter
- If visible, ensure it's formatted correctly with
---delimiters - Report bug if issue persists
Performance Issues
Problem: Laggy scrolling with large documents
Solutions:
- Plugin is optimized for large documents, but very long files (>10k lines) may be slow
- Try reducing navigation panel complexity by closing nested sections
- Disable debug mode if enabled
- Close other resource-intensive Obsidian plugins temporarily
Problem: High CPU usage
Solutions:
- Check if debug mode is enabled (Settings ā Developer)
- Disable scroll sync if enabled
- Close navigation panel if not needed
- Restart Obsidian to clear any memory leaks
Display Issues
Problem: Fullscreen not working
Solutions:
- Fullscreen expands within Obsidian window (not true OS fullscreen)
- For true fullscreen: Use Obsidian's View ā Toggle Fullscreen first
- macOS: Ensure app has display permissions in System Preferences
Problem: Pin window not working
Solutions:
- macOS/Windows only feature (not available on Linux)
- Requires Electron API support
- Some window managers may override this behavior
- Try closing other "always on top" windows
Installation Issues
Problem: Plugin not appearing after installation
Solutions:
- Verify files are in correct location:
<vault>/.obsidian/plugins/teleprompter-plus/ - Required files:
main.js,styles.css,manifest.json - Check folder name matches plugin ID exactly
- Reload Obsidian:
Cmd/Ctrl + R
Problem: "Module not found: ws" error
Solutions:
- WebSocket module not installed correctly
- Run
bun install wsin plugin folder - Or copy
node_modules/ws/to plugin folder - For built-from-source: Ensure ws is bundled in build
Problem: Plugin fails to load
Solutions:
- Check Obsidian version (requires 1.0.0+)
- Look for errors in Developer Console:
Cmd/Ctrl + Shift + I - Verify manifest.json is valid JSON
- Try reinstalling from scratch
- Enable Debug Mode for detailed error logs
Getting Help
If issues persist:
-
Check Console Logs
- Open Developer Console:
Cmd/Ctrl + Shift + I - Look for errors (red text)
- Enable Debug Mode for verbose logging
- Open Developer Console:
-
Report Issues
- GitHub Issues
- Include: Obsidian version, plugin version, error messages, steps to reproduce
- Screenshots or video recordings are very helpful
-
Community Support
š ļø Development
Tech Stack
- Framework: Svelte 5 (latest with runes:
$state,$effect) - Language: TypeScript
- Build Tool: Vite
- Styling: Tailwind CSS + custom CSS
- API: Obsidian Plugin API
- WebSocket: ws library
- Markdown: marked.js + highlight.js
Project Structure
obsidian-teleprompter-plus/
āāā src/
ā āāā main.ts # Plugin entry point
ā āāā view.ts # View registration
ā āāā TeleprompterApp.svelte # Main UI component (1800+ lines)
ā āāā settings.ts # Settings tab and interface
ā āāā websocket-server.ts # WebSocket server implementation
ā āāā websocket-loader.ts # Dynamic ws module loading
āāā dist/ # Build output
ā āāā main.js # Compiled plugin
ā āāā styles.css # Compiled styles
āāā manifest.json # Plugin manifest
āāā package.json # Dependencies
āāā tsconfig.json # TypeScript config
āāā vite.config.ts # Vite config
āāā tailwind.config.js # Tailwind config
āāā README.md # This file
Setup Development Environment
# 1. Clone repository
git clone https://github.com/JuracyAmerico/obsidian-teleprompter-plus.git
cd obsidian-teleprompter-plus
# 2. Install dependencies
bun install
# 3. Start development server with hot reload
bun run dev
# 4. Build for production
bun run build
# 5. Preview production build
bun run preview
Development Workflow
- Make changes to source files in
src/ - Hot reload updates automatically with
bun run dev - Test in Obsidian by symlinking or copying to vault plugins folder
- Build with
bun run buildbefore committing - Update version in
manifest.jsonfor releases
Key Files to Understand
src/main.ts
- Plugin lifecycle (load, unload)
- Command registration (25+ commands)
- Settings management
- WebSocket server initialization
- View registration with Obsidian
src/TeleprompterApp.svelte
- Main UI component (all features)
- Reactive state management with Svelte 5 runes
- Event handlers for all controls
- WebSocket client integration
- Markdown rendering pipeline
- Performance optimizations (debouncing, memoization, RAF)
src/settings.ts
- Settings interface definition
- Default values
- Settings tab UI
- Validation and persistence
src/websocket-server.ts
- WebSocket server setup
- Client connection management
- Command parsing and routing
- State broadcasting
- Error handling and reconnection
Performance Considerations
The plugin implements several optimizations:
-
Debounced Scroll Handler (50ms)
- Reduces CPU usage during scrolling
- Uses passive event listeners
-
Memoized Markdown Rendering
- Skips re-rendering unchanged content
- Tracks last rendered content
-
requestAnimationFrame for Auto-Scroll
- Smooth 60fps scrolling
- Time-based delta calculations for consistent speed
-
Batch DOM Operations
- Header registration uses RAF
- Reduces layout thrashing
-
Conditional Logging
- Debug mode prevents log spam in production
- 78+ logs hidden by default
Contributing
Contributions are welcome! Here's how:
- Fork the repository
- Create a branch for your feature:
git checkout -b feature/amazing-feature - Make your changes following existing code style
- Test thoroughly in Obsidian
- Commit with clear messages:
git commit -m "Add amazing feature" - Push to your fork:
git push origin feature/amazing-feature - Open a Pull Request with description of changes
Contribution Guidelines
- Code Style: Follow existing TypeScript/Svelte patterns
- Naming: Use camelCase for variables, PascalCase for components
- Comments: Add JSDoc comments for public functions
- Testing: Test with various document sizes and themes
- Performance: Avoid blocking operations, use RAF for animations
- Accessibility: Maintain keyboard navigation and ARIA labels
Development Tips
- Use Debug Mode to see detailed logs
- Test with long documents (1000+ lines)
- Test with multiple themes (light/dark)
- Test WebSocket with Stream Deck emulator
- Check console for errors regularly
- Use TypeScript strict mode
š Roadmap
ā Completed Features (v0.5.0)
- ā Core teleprompter functionality
- ā Stream Deck integration (55+ actions)
- ā Complete keyboard control (25+ commands)
- ā Advanced navigation with hierarchical headers
- ā Abstract scrollbar minimap
- ā Active section highlighting
- ā Full-screen mode
- ā Keep awake functionality
- ā Pin window (macOS/Windows)
- ā Countdown timer (single-use)
- ā Flip modes (horizontal/vertical)
- ā Scroll sync with editor
- ā Advanced settings (speed, navigation, behavior)
- ā Performance optimizations
- ā Debug mode
- ā Full Markdown support
- ā Theme integration
ā Completed Features (v0.9.0)
Core Features
- Professional teleprompter view - Full-featured reading display
- Auto-scrolling - Configurable speed with smooth animation
- Multiple themes - 8 built-in profiles (Professional, Broadcast, Stream, Practice, etc.)
- Customizable colors - Full color picker for text/background with presets
- Font family selection - 10 font options
- Eyeline indicator - Configurable reading position guide
Remote Control (v0.9.0)
- Remote web interface - Control from any device on your network
- Mobile-optimized UI - Touch-friendly controls for phone/tablet
- Real-time sync - Instant state synchronization via WebSocket
- Section navigation - Jump to headers from remote
Professional Features
- OBS integration - Start/stop recording synced with teleprompter
- Stream Deck support - 55+ actions for professional control
- Countdown timer - Visual countdown before auto-scroll starts
- Focus mode - Dim text outside eyeline for better focus
- Voice tracking (Beta) - Experimental speech-following scroll
UX Enhancements
- Speed presets - Quick switch between 6 preset speeds
- Custom hotkeys - Define your own keyboard shortcuts
- Double-click to edit - Jump to source line in editor
- Flip/mirror modes - Horizontal and vertical flip
- Minimap - Document overview with position indicator
š” Feature Requests
Have an idea? Open a discussion or submit an issue!
š License
MIT License - See LICENSE file for details.
Copyright (c) 2024-2025 Americo
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
š Acknowledgments
Created with ā¤ļø by Americo
Special Thanks To:
- Obsidian Team - For the excellent plugin API and amazing note-taking app
- Elgato - For Stream Deck SDK and documentation
- Svelte Team - For the reactive framework and Svelte 5 innovations
- Open Source Community - For inspiration and support
Built With:
- Obsidian - Knowledge base application
- Svelte - Reactive UI framework
- TypeScript - Type-safe JavaScript
- Vite - Fast build tool
- Tailwind CSS - Utility-first CSS
- marked.js - Markdown parser
- highlight.js - Syntax highlighting
- ws - WebSocket library
š Support & Community
Get Help
- š Documentation: You're reading it!
- š Bug Reports: GitHub Issues
- š¬ Discussions: GitHub Discussions
- š” Feature Requests: GitHub Issues
- šØļø Community Forum: Obsidian Forum
Stay Updated
- ā Star the repo to show support
- š Watch for updates and releases
- š Subscribe to release notifications
Support Development
If you find this plugin useful and want to support its development:
Your support helps with:
- Continued development and new features
- Bug fixes and maintenance
- Documentation improvements
- Community support
Share Your Experience
If you enjoy using Teleprompter Plus:
- Share it with the Obsidian community
- Leave feedback on the forum
- Contribute improvements
- Report bugs to help make it better
š Project Stats
- Version: 0.9.1
- Lines of Code: 3000+ (TypeScript/Svelte)
- Commands: 25+
- Stream Deck Actions: 55+
- Settings Options: 15+
- Supported Platforms: Windows, macOS, Linux (desktop only)
- Minimum Obsidian Version: 1.0.0
Made with ā¤ļø for the Obsidian community
Transform your notes into professional presentations with Obsidian Teleprompter Plus š¬
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.