Files
obswiki/README.md
Ryan Chen e55aa1153d Update README to emphasize Obsidian vault compatibility
- Clarify that ObsWiki serves existing Obsidian vaults as web wikis
- Add explanation of what Obsidian and vaults are
- Restructure Quick Start with options for existing vs new vaults
- Add comprehensive Obsidian compatibility section with feature matrix
- Document required Obsidian settings (absolute paths, disable wikilinks)
- Enhance feature descriptions to highlight Obsidian-specific capabilities
- Update vault structure examples to reflect realistic Obsidian organization

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-08-10 10:38:53 -04:00

379 lines
10 KiB
Markdown

# ObsWiki
A secure web server for serving **Obsidian vaults** as online wikis. Transform your Obsidian notes into a beautiful, searchable web wiki with authentication and access control.
[Obsidian](https://obsidian.md) is a powerful note-taking application that stores notes in "vaults" - folders containing markdown files with special linking features. ObsWiki lets you share these vaults online while preserving all the Obsidian-specific markdown features you love.
## Features
- **Full Obsidian vault compatibility** - Point to any existing Obsidian vault
- **Native Obsidian markdown support** including:
- Wiki links (`[[Page Name]]` and `[[Page Name|Display Text]]`)
- Tags (`#tag` and nested tags `#category/subtag`)
- Block references and embeds
- Frontmatter metadata
- **Multi-provider authentication**:
- Local username/password
- GitHub OAuth
- Google OAuth (configurable)
- LDAP (configurable)
- **Role-based access control** with path-specific permissions
- **Real-time search** with live search results
- **Responsive design** with dark/light mode support
- **SQLite database** for user management and access rules
## Quick Start
### Option 1: Use an Existing Obsidian Vault
1. **Build the project**:
```bash
cargo build --release
```
2. **Create configuration**:
```bash
cp config.toml.example config.toml
# Edit config.toml with your settings
```
3. **Point to your Obsidian vault**:
```bash
./target/release/obswiki --wiki-path /path/to/your/obsidian/vault
```
### Option 2: Create a New Vault
1. **Build the project**:
```bash
cargo build --release
```
2. **Create configuration**:
```bash
cp config.toml.example config.toml
```
3. **Create a new vault directory**:
```bash
mkdir my-vault
echo "# Welcome to My Vault\n\nThis is your home page! Try creating [[Another Page]] with wiki links." > my-vault/index.md
```
4. **Run the server**:
```bash
./target/release/obswiki --wiki-path my-vault
# Or use default port and path:
./target/release/obswiki
```
5. **Access your wiki**:
- Open http://localhost:3000
- Default admin login: `admin` / `admin123`
## Obsidian Vault Compatibility
### What Works Out of the Box
- ✅ **All markdown files** in your vault
- ✅ **Folder structure** preserved exactly as in Obsidian
- ✅ **Wiki links** `[[Page Name]]` and `[[Page|Display]]`
- ✅ **Tags** `#tag` and `#category/subtag`
- ✅ **Frontmatter** YAML metadata
- ✅ **Standard markdown** formatting
- ✅ **Images and attachments** (if in vault)
- ✅ **Daily notes** and template structures
### Obsidian Features with Limitations
- ⚠️ **Block references** `[[Page#^blockid]]` - basic support
- ⚠️ **Embeds** `![[Page]]` - partial support for images
- ⚠️ **Dataview queries** - not supported (shows as code blocks)
- ⚠️ **Canvas files** - not displayed (Obsidian-specific)
- ⚠️ **Plugin-specific syntax** - may not render correctly
### Required Obsidian Settings
For optimal compatibility, configure these settings in your Obsidian vault:
**Files & Links Settings:**
- **New link format**: Set to "Absolute path in vault"
- **Use [[Wikilinks]]**: Set to **false** (unchecked)
These settings ensure that links work correctly when served through ObsWiki.
### Vault Setup Tips
1. **Point to your existing vault**: ObsWiki works with any Obsidian vault
2. **Configure Obsidian settings**: Use the required settings above for best compatibility
3. **No vault modification needed**: Your Obsidian vault remains untouched
4. **Real-time updates**: Changes to files are reflected immediately
5. **Access control**: Add authentication without changing your vault structure
## Configuration
### Basic Configuration
Edit `config.toml`:
```toml
[server]
host = "127.0.0.1"
port = 3000
static_dir = "static"
[auth]
jwt_secret = "your-secure-secret-key"
session_timeout = 86400 # 24 hours
[auth.providers]
local = true # Enable username/password auth
```
### OAuth Configuration
#### GitHub OAuth
1. Create a GitHub OAuth App:
- Go to GitHub Settings > Developer settings > OAuth Apps
- New OAuth App with callback URL: `http://localhost:3000/auth/github/callback`
2. Add to config.toml:
```toml
[auth.providers.oauth.github]
client_id = "your_github_client_id"
client_secret = "your_github_client_secret"
```
#### Google OAuth
1. Create Google OAuth credentials in Google Cloud Console
2. Add to config.toml:
```toml
[auth.providers.oauth.google]
client_id = "your_google_client_id"
client_secret = "your_google_client_secret"
```
### LDAP Configuration
```toml
[auth.providers.ldap]
server = "ldap://your-ldap-server:389"
bind_dn = "cn=admin,dc=example,dc=com"
bind_password = "admin_password"
user_base = "ou=users,dc=example,dc=com"
user_filter = "(uid={})"
```
## User Management
### User Roles
- **Admin**: Full access, can manage users and access rules
- **Editor**: Can edit and create pages (subject to access rules)
- **Viewer**: Read-only access (subject to access rules)
### Access Rules
Access rules control which users can access specific paths:
- **Path patterns**:
- `*` - matches everything (default rule)
- `admin/*` - matches all pages under admin/
- `private/secrets` - matches exact path
- **Rule priority**: More specific patterns take precedence
Example access rules (automatically created):
- `admin/*` requires admin role
- `private/*` requires editor role
- `*` allows viewer role (public access)
### Default Users
The system creates a default admin user:
- Username: `admin`
- Password: `admin123`
- **⚠️ Change this password immediately in production!**
## Obsidian Vault Features
### Full Obsidian Markdown Compatibility
ObsWiki supports all the markdown features that make Obsidian special:
- **Wiki links**:
- `[[Page Name]]` - links to pages
- `[[Page Name|Display Text]]` - links with custom text
- `[[Folder/Page Name]]` - links to pages in subfolders
- **Tags**:
- `#programming` - simple tags
- `#category/subcategory` - nested tags
- Tags are clickable and searchable
- **Frontmatter**: Full YAML metadata support
```markdown
---
title: "My Research Note"
author: "John Doe"
tags: [research, obsidian, markdown]
created: 2024-01-15
---
# Page Content
```
- **Block references**: Reference specific paragraphs and sections
- **Embeds**: Include content from other pages (partially supported)
### Vault Structure Compatibility
ObsWiki works with any Obsidian vault structure:
```
vault/
├── index.md # Home page (or README.md)
├── Daily Notes/
│ ├── 2024-01-15.md
│ └── 2024-01-16.md
├── Projects/
│ ├── ObsWiki.md
│ └── Personal Website.md
├── Areas/
│ ├── Programming/
│ │ ├── Rust.md
│ │ └── Web Development.md
│ └── Research/
│ └── Literature Review.md
├── Resources/
│ └── References.md
└── Archive/
└── Old Notes.md # Can be restricted by access rules
```
**Note**: ObsWiki respects your existing Obsidian vault organization and folder structure.
### Obsidian-Aware Search
- **Live search**: Search as you type, just like Obsidian
- **Content search**: Searches through all your note content
- **Tag search**: Use `#tagname` to find all notes with specific tags
- **Link-aware**: Understands your wiki link connections
- **Metadata search**: Searches through frontmatter properties
## API Endpoints
### Authentication
- `POST /auth/login` - Local login
- `POST /auth/register` - Register new user
- `GET /auth/github` - GitHub OAuth
- `GET /auth/github/callback` - GitHub OAuth callback
### Wiki
- `GET /wiki/:path` - View page
- `GET /api/wiki/:path` - Get page JSON
- `GET /api/search?q=query` - Search pages
## Development
### Project Structure
```
src/
├── main.rs # Entry point
├── auth/ # Authentication & authorization
├── config/ # Configuration management
├── markdown/ # Markdown parsing & rendering
├── models/ # Data models
├── server/ # Web server & routes
└── wiki/ # Wiki service & file management
```
### Running Tests
```bash
cargo test
```
### Database Migrations
Migrations run automatically on startup. Database schema:
- `users` - User accounts and profiles
- `sessions` - Session management
- `access_rules` - Path-based access control
## Security Features
- **JWT-based authentication** with configurable expiration
- **bcrypt password hashing** for local accounts
- **HTTPS ready** (configure reverse proxy)
- **Role-based access control** with path-specific rules
- **Session management** with automatic expiration
- **CSRF protection** (built into authentication flow)
## Production Deployment
### Using a Reverse Proxy
Example Nginx configuration:
```nginx
server {
listen 80;
server_name wiki.example.com;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
### Security Checklist
- [ ] Change default admin password
- [ ] Set secure JWT secret key
- [ ] Use HTTPS in production
- [ ] Configure proper OAuth callback URLs
- [ ] Set appropriate file permissions on wiki directory
- [ ] Regular database backups
- [ ] Monitor access logs
## Troubleshooting
### Common Issues
1. **"Permission denied" errors**:
- Check user roles and access rules
- Verify file system permissions
2. **OAuth not working**:
- Verify callback URLs match OAuth app configuration
- Check client ID and secret
3. **Pages not loading**:
- Ensure wiki directory exists and is readable
- Check file extensions (.md required)
### Logs
Enable debug logging:
```bash
RUST_LOG=debug ./obswiki
```
## Contributing
1. Fork the repository
2. Create a feature branch
3. Make changes with tests
4. Submit a pull request
## License
MIT License - see LICENSE file for details.