Frequently Asked Questions
Common questions about spectryn answered.
General
What is spectryn?
spectryn is a CLI tool that synchronizes markdown documentation with issue trackers like Jira, GitHub Issues, GitLab, Linear, and more. Write your epics and stories in markdown, and spectryn keeps them in sync with your tracker.
Why use markdown instead of the tracker directly?
| Markdown | Direct Tracker |
|---|---|
| ✅ Version controlled | ❌ No Git history |
| ✅ Review in PRs | ❌ Changes hard to review |
| ✅ Works offline | ❌ Requires connection |
| ✅ Any editor | ❌ Web UI only |
| ✅ AI-friendly | ❌ Manual entry |
| ✅ Bulk editing easy | ❌ One at a time |
Which trackers are supported?
- Jira (Cloud and Server)
- GitHub Issues & Projects
- GitLab Issues
- Linear
- Trello
- ClickUp
- Monday.com
- Shortcut (formerly Clubhouse)
- YouTrack
- Plane.so
- Pivotal Tracker
- Basecamp
- Bitbucket Issues
See Tracker Guides for setup instructions.
Is spectryn free?
Yes! spectryn is open source under the MIT license. Use it for personal and commercial projects freely.
Installation
How do I install spectryn?
# Using pip (recommended)
pip install spectryn
# Using pipx (isolated environment)
pipx install spectryn
# Using Homebrew (macOS)
brew tap adriandarian/spectra https://github.com/adriandarian/spectra
brew install spectra
# Using Docker
docker pull ghcr.io/adriandarian/spectrynSee Installation Guide for all options.
What Python version do I need?
Python 3.11 or higher is required.
python --version # Should be 3.11+Does it work on Windows?
Yes! spectryn works on Windows, macOS, and Linux. For Windows, we recommend using:
- Windows Terminal
- PowerShell 7+
- Or WSL2
Configuration
Where should I put my config file?
spectryn searches for configuration in this order:
--configflag path./spectryn.yaml(current directory)./.spectryn/config.yaml~/.config/spectryn/config.yaml
Recommendation: Put spectryn.yaml in your project root.
How do I store API tokens securely?
Never put tokens in config files! Use environment variables:
# .env file (add to .gitignore)
JIRA_API_TOKEN=your-token-here# spectryn.yaml
jira:
api_token: ${JIRA_API_TOKEN}For teams, use secret managers:
- HashiCorp Vault
- AWS Secrets Manager
- 1Password
- Doppler
See Secret Management.
How do I connect to Jira Server (on-premise)?
# spectryn.yaml
tracker: jira
jira:
url: https://jira.yourcompany.com
auth_type: basic # or 'pat' for personal access token
username: ${JIRA_USERNAME}
password: ${JIRA_PASSWORD} # or api_token for PATWriting Stories
What's the recommended story format?
### 🔐 US-001: Story Title
| Field | Value |
|-------|-------|
| **Story Points** | 5 |
| **Priority** | 🟠 High |
| **Status** | 📋 To Do |
#### Description
**As a** [user type]
**I want** [goal]
**So that** [benefit]
#### Acceptance Criteria
- [ ] Criterion 1
- [ ] Criterion 2
- [ ] Criterion 3
#### Subtasks
| # | Subtask | Description | SP | Status |
|---|---------|-------------|:--:|--------|
| 1 | Task 1 | Description | 1 | 📋 To Do |See Schema Reference for all options.
Can I use my own story ID format?
Yes! Configure the pattern in spectryn.yaml:
story_id_pattern: "STORY-\\d+" # STORY-001
# or
story_id_pattern: "[A-Z]+-\\d+" # ABC-123
# or
story_id_pattern: "#\\d+" # #123Do I need to use emojis?
No, emojis are optional. Plain text works fine:
| **Status** | To Do | # Works
| **Status** | 📋 To Do | # Also worksConfigure mappings for your preference:
mappings:
status:
"To Do": To Do
"📋 To Do": To DoHow do I handle story dependencies?
Use the "Blocks" or "Depends On" fields:
| **Blocks** | US-002, US-003 |
| **Depends On** | US-000 |Or in description:
> Blocked by US-000
> Blocks: US-002Syncing
What happens during a sync?
- Parse - Read markdown file
- Fetch - Get current tracker state
- Diff - Compare markdown vs tracker
- Plan - Determine required changes
- Execute - Apply changes to tracker
Will sync overwrite my tracker changes?
By default, spectryn shows what would change (dry run). Changes only apply with --execute:
# Safe - just shows diff
spectryn --markdown EPIC.md
# Actually makes changes
spectryn --execute --markdown EPIC.mdHow do I sync only specific stories?
# Single story
spectryn sync --story US-001 --markdown EPIC.md
# Multiple stories
spectryn sync --stories US-001,US-002,US-003 --markdown EPIC.md
# By status
spectryn sync --filter "status=To Do" --markdown EPIC.mdCan I sync bidirectionally?
Yes! Import tracker changes back to markdown:
# One-way: Markdown → Tracker
spectryn sync --execute --markdown EPIC.md
# Import: Tracker → Markdown
spectryn import --epic PROJ-123 --output EPIC.md
# Bidirectional with conflict resolution
spectryn sync --bidirectional --interactive --markdown EPIC.mdWhat if there's a conflict?
spectryn detects conflicts and offers resolution:
# Interactive resolution
spectryn sync --interactive --markdown EPIC.md
# Force markdown to win
spectryn sync --force-local --markdown EPIC.md
# Force tracker to win
spectryn sync --force-remote --markdown EPIC.mdTroubleshooting
Why do I get "401 Unauthorized"?
Your API token is invalid or expired:
- Generate a new token from your tracker
- Update environment variable
- Run
spectryn doctorto verify
Why are my stories not being found?
Check your markdown format:
spectryn --validate --markdown EPIC.mdCommon issues:
- Wrong heading level (use
##or###) - Missing story ID pattern
- Malformed metadata table
How do I debug sync issues?
# Verbose output
spectryn --verbose --markdown EPIC.md
# Debug mode with full logs
spectryn --debug --markdown EPIC.md
# Check diagnostics
spectryn doctorWhere are the log files?
# Default location
~/.spectryn/logs/spectryn.log
# Or set custom location
export SPECTRA_LOG_FILE=/path/to/spectryn.logAdvanced Usage
Can I use spectryn in CI/CD?
Absolutely! spectryn is designed for CI/CD:
# GitHub Actions
- name: Sync Stories
run: spectryn sync --execute --markdown docs/epics/
env:
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }}See CI/CD Setup Tutorial.
How do I sync to multiple trackers?
# spectryn.yaml
trackers:
jira:
url: https://company.atlassian.net
project: BACKEND
github:
repo: company/frontend
project: Frontend Board# Sync to both
spectryn sync --trackers jira,github --markdown EPIC.mdCan I extend spectryn with plugins?
Yes! spectryn has a plugin system:
# Install a plugin
spectryn plugin install spectryn-custom-fields
# List plugins
spectryn plugin list
# Create your own
spectryn plugin scaffold --name my-pluginSee Plugins Guide.
Does spectryn support webhooks?
Yes, for real-time sync:
# Start webhook listener
spectryn webhook listen --port 8080
# Configure in your tracker to send webhooks to:
# https://your-server.com:8080/webhookPerformance
How fast is spectryn?
Typical performance:
- Parse 100 stories: ~50ms
- Sync 100 stories: ~10 seconds
- Incremental sync: ~2 seconds
How do I speed up large syncs?
# spectryn.yaml
performance:
parallel_sync: true
max_workers: 4
cache:
enabled: trueIs there a limit on stories?
No hard limit. We've tested with:
- 10,000+ stories
- 50+ epics
- Files >50MB (use streaming mode)
Data & Security
Where is my data stored?
- Config:
spectryn.yamlin your project - State:
.spectryn/state.json(tracks sync state) - Cache: In memory or configured location
- Logs:
~/.spectryn/logs/
spectryn never sends data to external servers (except your configured tracker).
Is my data encrypted?
- In transit: Yes, all API calls use HTTPS
- At rest: Cache can be encrypted with
cache.encrypt: true - Tokens: Use environment variables, never stored in files
Does spectryn collect telemetry?
By default, no. Optional anonymous usage stats can be enabled:
telemetry:
enabled: false # DefaultSee Telemetry Policy.
Getting Help
Where can I get support?
- Documentation: You're here! 📚
- GitHub Issues: Report bugs
- Discussions: Ask questions
How do I report a bug?
# Generate diagnostic report
spectryn doctor --report > diagnostics.txtThen open an issue with:
- spectryn version
- Python version
- OS
- Steps to reproduce
- Diagnostic report (redact secrets!)
How can I contribute?
We welcome contributions! See Contributing Guide.
# Set up development environment
git clone https://github.com/adriandarian/spectryn
cd spectryn
pip install -e ".[dev]"
pytest