ai.log
AI-powered static blog generator with ATProto integration, part of the ai.ai ecosystem.
🚀 Quick Start
Installation & Setup
# 1. Clone repository
git clone https://git.syui.ai/ai/log
cd log
# 2. Build ailog
cargo build --release
# 3. Initialize blog
./target/release/ailog init my-blog
# 4. Create your first post
./target/release/ailog new "My First Post"
# 5. Build static site
./target/release/ailog build
# 6. Serve locally
./target/release/ailog serve
Install via Cargo
cargo install --path .
# Now you can use `ailog` command globally
📖 Core Commands
Blog Management
# Project setup
ailog init <project-name> # Initialize new blog project
ailog new <title> # Create new blog post
ailog build # Generate static site with JSON index
ailog serve # Start development server
ailog clean # Clean build artifacts
# ATProto authentication
ailog auth init # Setup ATProto credentials
ailog auth status # Check authentication status
ailog auth logout # Clear credentials
# OAuth app build
ailog oauth build <project-dir> # Build OAuth comment system
Stream & AI Features
# Start monitoring & AI generation
ailog stream start --ai-generate # Monitor blog + auto-generate AI content
ailog stream start --daemon # Run as background daemon
ailog stream status # Check stream status
ailog stream stop # Stop monitoring
ailog stream test # Test ATProto API access
Documentation & Translation
# Generate documentation
ailog doc readme --with-ai # Generate enhanced README
ailog doc api --output ./docs # Generate API documentation
ailog doc structure --include-deps # Analyze project structure
# AI-powered translation
ailog doc translate --input README.md --target-lang en
ailog doc translate --input docs/guide.ja.md --target-lang en --model qwen2.5:latest
🏗️ Architecture
Project Structure
ai.log/
├── src/ # Rust static blog generator
│ ├── commands/ # CLI command implementations
│ ├── generator.rs # Core blog generation + JSON index
│ ├── mcp/ # MCP server integration
│ └── main.rs # CLI entry point
├── my-blog/ # Your blog content
│ ├── content/posts/ # Markdown blog posts
│ ├── templates/ # Tera templates
│ ├── static/ # Static assets
│ └── public/ # Generated site output
├── oauth/ # ATProto comment system
│ ├── src/ # TypeScript OAuth app
│ ├── dist/ # Built OAuth assets
│ └── package.json # Node.js dependencies
└── target/ # Rust build output
Data Flow
Blog Posts (Markdown) → ailog build → public/
├── Static HTML pages
└── index.json (API)
↓
ailog stream start --ai-generate → Monitor index.json
↓
New posts detected → Ollama AI → ATProto records
├── ai.syui.log.chat.lang (translations)
└── ai.syui.log.chat.comment (AI comments)
↓
OAuth app → Display AI-generated content
🤖 AI Integration
AI Content Generation
The --ai-generate
flag enables automatic AI content generation:
- Blog Monitoring: Monitors
index.json
every 5 minutes - Duplicate Prevention: Checks existing ATProto collections
- AI Generation: Uses Ollama (gemma3:4b) for translations & comments
- ATProto Storage: Saves to derived collections (
base.chat.lang
,base.chat.comment
)
# Start AI generation monitor
ailog stream start --ai-generate
# Output:
# 🤖 Starting AI content generation monitor...
# 📡 Blog host: https://syui.ai
# 🧠 Ollama host: https://ollama.syui.ai
# 🔍 Checking for new blog posts...
# ✅ Generated translation for: 静的サイトジェネレータを作った
# ✅ Generated comment for: 静的サイトジェネレータを作った
Collection Management
ailog uses a simplified collection structure based on a single base collection name:
# Single environment variable controls all collections (unified naming)
export VITE_OAUTH_COLLECTION="ai.syui.log"
# Automatically derives:
# - ai.syui.log (comments)
# - ai.syui.log.user (user management)
# - ai.syui.log.chat.lang (AI translations)
# - ai.syui.log.chat.comment (AI comments)
Benefits:
- ✅ Simple: One variable instead of 5+
- ✅ Consistent: All collections follow the same pattern
- ✅ Manageable: Easy systemd/production configuration
Ask AI Feature
Interactive AI chat integrated into blog pages:
# 1. Setup Ollama
brew install ollama
ollama pull gemma2:2b
# 2. Start with CORS support
OLLAMA_ORIGINS="https://example.com" ollama serve
# 3. Configure AI DID in templates/base.html
const aiConfig = {
systemPrompt: 'You are a helpful AI assistant.',
aiDid: 'did:plc:your-ai-bot-did'
};
🌐 ATProto Integration
OAuth Comment System
The OAuth app provides ATProto-authenticated commenting:
# 1. Build OAuth app
cd oauth
npm install
npm run build
# 2. Configure for production
ailog oauth build my-blog # Auto-generates .env.production
# 3. Deploy OAuth assets
# Assets are automatically copied to public/ during ailog build
Authentication Setup
# Initialize ATProto authentication
ailog auth init
# Input required:
# - Handle (e.g., your.handle.bsky.social)
# - Access JWT
# - Refresh JWT
# Check status
ailog auth status
Collection Structure
All ATProto collections are automatically derived from a single base name:
Base Collection: "ai.syui.log"
├── ai.syui.log (user comments)
├── ai.syui.log.user (registered commenters)
└── ai.syui.log.chat/
├── ai.syui.log.chat.lang (AI translations)
└── ai.syui.log.chat.comment (AI comments)
Configuration Priority:
- Environment variable:
VITE_OAUTH_COLLECTION
(unified) - config.toml:
[oauth] collection = "..."
- Auto-generated from domain (e.g.,
log.syui.ai
→ai.syui.log
) - Default:
ai.syui.log
Stream Monitoring
# Monitor ATProto streams for comments
ailog stream start
# Enable AI generation alongside monitoring
ailog stream start --ai-generate --daemon
📱 OAuth App Features
The OAuth TypeScript app provides:
Comment System
- Real-time Comments: ATProto-authenticated commenting
- User Management: Automatic user registration
- Mobile Responsive: Optimized for all devices
- JSON View: Technical record inspection
AI Content Display
- Lang: EN Tab: AI-generated English translations
- AI Comment Tab: AI-generated blog insights
- Admin Records: Fetches from admin DID collections
- Real-time Updates: Live content refresh
Setup & Configuration
cd oauth
# Development
npm run dev
# Production build
npm run build
# Preview production
npm run preview
Environment Variables:
# Production (.env.production - auto-generated by ailog oauth build)
VITE_APP_HOST=https://syui.ai
VITE_OAUTH_CLIENT_ID=https://syui.ai/client-metadata.json
VITE_OAUTH_REDIRECT_URI=https://syui.ai/oauth/callback
VITE_ADMIN_DID=did:plc:uqzpqmrjnptsxezjx4xuh2mn
# Simplified collection configuration (single base collection)
VITE_OAUTH_COLLECTION=ai.syui.log
# AI Configuration
VITE_AI_ENABLED=true
VITE_AI_ASK_AI=true
VITE_AI_PROVIDER=ollama
# ... (other AI settings)
🔧 Advanced Features
JSON Index Generation
Every ailog build
generates /public/index.json
:
[
{
"title": "静的サイトジェネレータを作った",
"href": "https://syui.ai/posts/2025-06-06-ailog.html",
"formated_time": "Thu Jun 12, 2025",
"utc_time": "2025-06-12T00:00:00Z",
"tags": ["blog", "rust", "mcp", "atp"],
"contents": "Plain text content...",
"description": "Excerpt...",
"categories": []
}
]
This enables:
- API Access: Programmatic blog content access
- Stream Monitoring: AI generation triggers
- Search Integration: Full-text search capabilities
Translation System
AI-powered document translation with Ollama:
# Basic translation
ailog doc translate --input README.md --target-lang en
# Advanced options
ailog doc translate \
--input docs/guide.ja.md \
--target-lang en \
--source-lang ja \
--model qwen2.5:latest \
--output docs/guide.en.md
Features:
- Markdown-aware: Preserves code blocks, links, tables
- Multiple models: qwen2.5, gemma3, etc.
- Auto-detection: Detects Japanese content automatically
- Structure preservation: Maintains document formatting
MCP Server Integration
# Start MCP server for ai.gpt integration
ailog mcp --port 8002
# Available tools:
# - create_blog_post
# - list_blog_posts
# - build_blog
# - get_post_content
# - translate_document
# - generate_documentation
🚀 Deployment
GitHub Actions
name: Deploy ai.log Blog
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup Rust
uses: actions-rs/toolchain@v1
with:
toolchain: stable
- name: Build ailog
run: cargo build --release
- name: Build blog
run: |
cd my-blog
../target/release/ailog build
- name: Deploy to Cloudflare Pages
uses: cloudflare/pages-action@v1
with:
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
projectName: my-blog
directory: my-blog/public
Production Setup
# 1. Build for production
cargo build --release
# 2. Setup systemd services
sudo cp systemd/system/ailog-stream.service /etc/systemd/system/
sudo systemctl enable ailog-stream.service
sudo systemctl start ailog-stream.service
# 3. Configure Ollama with CORS
sudo vim /usr/lib/systemd/system/ollama.service
# Add: Environment="OLLAMA_ORIGINS=https://yourdomain.com"
# 4. Monitor services
journalctl -u ailog-stream.service -f
🌍 Translation Support
Supported Languages
Language | Code | Status | Model |
---|---|---|---|
English | en |
✅ Full | qwen2.5 |
Japanese | ja |
✅ Full | qwen2.5 |
Chinese | zh |
✅ Full | qwen2.5 |
Korean | ko |
⚠️ Basic | qwen2.5 |
Spanish | es |
⚠️ Basic | qwen2.5 |
Translation Workflow
- Parse: Analyze markdown structure
- Preserve: Isolate code blocks and technical content
- Translate: Process with Ollama AI
- Reconstruct: Rebuild with original formatting
- Validate: Ensure structural integrity
🎯 Use Cases
Personal Blog
- AI-Enhanced: Automatic translations and AI insights
- Distributed Comments: ATProto-based social interaction
- Mobile-First: Responsive OAuth comment system
Technical Documentation
- Code Analysis: Automatic API documentation
- Multi-language: AI-powered translation
- Structure Analysis: Project overview generation
AI Ecosystem Integration
- ai.gpt Connection: Memory-driven content generation
- MCP Integration: Claude Code workflow support
- Distributed Identity: ATProto authentication
🔍 Troubleshooting
Build Issues
# Check Rust version
rustc --version
# Update dependencies
cargo update
# Clean build
cargo clean && cargo build --release
Authentication Problems
# Reset authentication
ailog auth logout
ailog auth init
# Test API access
ailog stream test
AI Generation Issues
# Check Ollama status
curl http://localhost:11434/api/tags
# Test with manual request
curl -X POST http://localhost:11434/api/generate \
-d '{"model":"gemma3:4b","prompt":"Test","stream":false}'
# Check CORS settings
# Ensure OLLAMA_ORIGINS includes your domain
OAuth App Issues
# Rebuild OAuth assets
cd oauth
rm -rf dist/
npm run build
# Check environment variables
cat .env.production
# Verify client-metadata.json
curl https://yourdomain.com/client-metadata.json
📚 Documentation
Core Concepts
- Static Generation: Rust-powered site building
- JSON Index: API-compatible blog data
- ATProto Integration: Distributed social features
- AI Enhancement: Automatic content generation
File Structure
config.toml
: Blog configuration (simplified collection setup)content/posts/*.md
: Blog post sourcestemplates/*.html
: Tera template filespublic/
: Generated static site + API (index.json)oauth/dist/
: Built OAuth assets
Example config.toml
[site]
title = "My Blog"
base_url = "https://myblog.com"
[oauth]
admin = "did:plc:your-admin-did"
collection = "ai.myblog.log" # Single base collection
[ai]
enabled = true
auto_translate = true
comment_moderation = true
model = "gemma3:4b"
host = "https://ollama.syui.ai"
🔗 ai.ai Ecosystem
ai.log is part of the broader ai.ai ecosystem:
- ai.gpt: Memory system and AI integration
- ai.card: ATProto-based card game system
- ai.bot: Social media automation
- ai.verse: 3D virtual world integration
- ai.shell: AI-powered shell interface
yui System Compliance
- Uniqueness: Each blog tied to individual identity
- Reality Reflection: Personal memories → digital content
- Irreversibility: Published content maintains integrity
📝 License
© syui
Part of the ai ecosystem: ai.gpt, ai.card, ai.log, ai.bot, ai.verse, ai.shell
Description
Languages
Rust
56.1%
JavaScript
27.3%
CSS
9.3%
HTML
6%
Shell
1.3%