Get Notes to Obsidian Importer 2.0 - Note Migration in the All-in AI Era
- Published on
- ...
- Authors

- Name
- Huashan
- @herohuashan
Why Switch from flomo to Get Notes?
I previously wrote an article about flomo-to-obsidian-importer, sharing how to sync flomo notes to Obsidian. That plugin helped many friends, and I enjoyed using it myself.
But recently, I made a decision: All in AI.
This means I need to reassess my tool chain. Get Notes (biji.com), a lightweight Chinese note-taking service, has several appealing features:
- 🚀 Lightweight: Focused on quick capture, no bloated features
- 💬 Voice Notes: Supports voice input, perfect for fragmented recording
- 🔄 Data Export: Supports complete HTML format export
Since I switched note services, the need to sync to Obsidian remained. So I decided: Build a new wheel with AI.
🤖 Vibe Coding: Writing Code with AI
If you've read my previous articles, you know I've been practicing a development approach called Vibe Coding:
Tell AI your ideas, let it translate them into code. You handle the What, AI handles the How.
Developing the get-to-obsidian plugin deepened my appreciation for this approach. I'm not a professional frontend developer, and TypeScript is something I only partially understand. But with AI, I can:
- Describe requirements: "I need a plugin that uses Playwright to auto-login to Get Notes, export data, parse HTML, then import to Obsidian"
- Iterate improvements: "The attachment path is too deep, can we simplify it to two levels?"
- Debug: "Why can't the browser find the login button? Help me check the selector"
- Learn: "What does this code mean? Why use async/await?"
Throughout the development process, I didn't write a single line of code from scratch, yet I completely understand how every feature works.
✨ Plugin Features Overview
Core Features
- ✅ Incremental Sync: Intelligently identifies synced notes, only imports new content
- ✅ Smart Update Detection: Automatically identifies modified notes and re-imports them
- ✅ Multiple Sync Methods:
- Auto-sync on startup
- Hourly scheduled sync
- Manual one-click sync
- Manual ZIP file import
Visualization Features
- 🎨 Moments Timeline: Display all notes in reverse chronological order
- 🎨 Canvas View: Canvas mode to visualize note networks
Advanced Features
- 🔗 Bidirectional Links: Preserves
[[wiki-links]]format - 📅 Merge by Date: Optionally merge notes from the same day
- 🖼️ Attachment Support: Auto-download images, audio, etc.
- ⚡ Highlight Conversion:
<mark>→==highlight==
🛠️ Major Updates in Version 2.0
Compared to the original plugin, version 2.0 includes several key improvements:
1. 🔇 Silent Background Sync
Problem: The original version popped up a browser window every sync, disrupting workflow.
Solution:
// Use headless mode
const browser = await chromium.launch({
headless: true, // Key: run silently in background
});
Now syncing happens completely in the background—you won't even notice it working.
2. 📁 Simplified Attachment Structure
Problem: Get Notes exports attachments with deep paths like file/date/userID/filename.
Solution:
❌ Before: get picture/file/2024-01-15/abc123/image.jpg
✅ Now: get attachment/2024-01-15/image.jpg
Flattened structure, cleaner vault organization.
3. 🔄 Smart Content Update Detection
Problem: If you modify a note in Get Notes, the plugin wouldn't re-import it.
Solution:
// Based on note ID rather than content hash
// If note ID matches but content changed, re-import
const memoId = extractMemoIdFromFilename(filename);
Now modified notes are detected and updated.
4. 🗑️ Reset Sync History
Problem: Sometimes you need to completely re-import all notes, but there was no easy way.
Solution: Added "Reset Sync History" button in settings, one-click to clear sync records.
5. ⚙️ Dynamic Path Configuration
Problem: Attachment path and main directory settings weren't linked.
Solution: Attachment directory now follows the "Get Notes main directory" setting automatically.
📦 Installation Guide
Prerequisites
- Obsidian 0.15.0+
- Node.js (for building)
- Desktop only (requires Playwright)
Installation Steps
# 1. Clone the repository
git clone https://github.com/geekhuashan/get-to-obsidian.git
cd get-to-obsidian
# 2. Install dependencies
npm install
# 3. Install Playwright (Important!)
npx [email protected] install
# 4. Build
npm run build
# 5. Copy to Obsidian plugins directory
# Copy main.js, manifest.json, styles.css to
# .obsidian/plugins/get-importer/
⚠️ Playwright is required: This is the core dependency for browser automation. Without it, sync functionality won't work at all.
First Use
- Click the 📓 icon in the left sidebar
- Click "Login to Get Notes"
- Complete SMS verification login in the popup browser
- Click "Sync Now"
That's it.
🔧 Technical Architecture
For those who want to understand or modify the code, here's the core flow:
User triggers sync
↓
Playwright loads authentication state
↓
Auto-export HTML archive
↓
Parse HTML, extract note content
↓
Generate unique ID, filter synced notes
↓
Convert to Markdown
↓
Save to Obsidian vault
↓
Optional: Generate Moments/Canvas
↓
Update sync records
Project Structure
get-to-obsidian/
├── main.ts # Plugin entry
├── lib/
│ ├── get/
│ │ ├── auth.ts # SMS verification login
│ │ ├── exporter.ts # Playwright auto-export
│ │ ├── core.ts # HTML parsing
│ │ └── importer.ts # Import logic
│ ├── obIntegration/
│ │ ├── canvas.ts # Canvas generation
│ │ └── moments.ts # Timeline generation
│ └── ui/ # User interface
Core Dependencies
- Playwright 1.43.1: Browser automation
- node-html-parser: HTML parsing
- turndown: HTML → Markdown conversion
- fs-extra: File operations
💡 Lessons Learned During Development
Technical Level
- Playwright's headless mode: Running browser in background, invisible to users
- Incremental sync ID design: Simple approach to deduplication
- Obsidian Plugin API: Understanding proper use of Vault API
- TypeScript type gymnastics: Though AI wrote it, I finally understand why types matter
Product Level
- UX details matter: Silent sync vs popup makes a huge difference
- Path design: Flat > nested, unless there's a clear reason
- Backward compatibility: Upgrades shouldn't break existing user data
AI Development Level
- Clear requirement descriptions are more important than writing code
- AI is a tool, not magic: You need to understand what it's doing
- Iteration > perfection: Get it running first, then optimize
- Debugging is the best learning opportunity: AI's errors often reveal your blind spots
🎯 Who Is This For?
- ✅ Using Get Notes and want to sync content to Obsidian
- ✅ Want automated sync, no manual export/import
- ✅ Need Moments/Canvas visualization to review notes
- ✅ Willing to install Playwright
Not suitable for:
- ❌ Mobile users (Playwright only runs on desktop)
- ❌ Users who don't want to install extra dependencies
🚀 Future Plans?
Honestly, I don't have many "plans." This plugin solved my own problem, and I'm sharing it.
If you have new requirements:
- Fork it
- Let AI help you modify it
- Submit a PR
This is an era where ordinary people can participate in open source. You don't need to be a professional developer—you just need ideas, then let AI help you implement them.
📮 Links
- GitHub: github.com/geekhuashan/get-to-obsidian
- Related Article: flomo-to-obsidian-importer
This article documents my journey from flomo to Get Notes, and rebuilding a sync plugin with AI. Hope it inspires those of you on the All-in AI path.
This project is completely free and open source. Stars, Forks, and PRs are welcome!
Made with ❤️ and AI
Related Posts
OpenClaw Brings *Her* into the Real World: I Built an AI Companion That Remembers and Gets Things Done
What made *Her* real for me wasn’t a single model—it was OpenClaw. By connecting long-term memory, a permission system, and local execution, it turns AI from “good at conversation” into something that can truly accompany you and take action.
I Built an AI Automation System with OpenClaw That Handles 15 Tasks for Me Every Day
An open-source framework, four AI agents, and a fully automated personal productivity system — from Telegram chat to crypto reports, from English learning recommendations to multi-platform content publishing. This is my real daily routine built with OpenClaw.