Logo

Get Notes to Obsidian Importer 2.0 - Note Migration in the All-in AI Era

Published on
...
Authors

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:

  1. Describe requirements: "I need a plugin that uses Playwright to auto-login to Get Notes, export data, parse HTML, then import to Obsidian"
  2. Iterate improvements: "The attachment path is too deep, can we simplify it to two levels?"
  3. Debug: "Why can't the browser find the login button? Help me check the selector"
  4. 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

  1. Click the 📓 icon in the left sidebar
  2. Click "Login to Get Notes"
  3. Complete SMS verification login in the popup browser
  4. 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

  1. Playwright's headless mode: Running browser in background, invisible to users
  2. Incremental sync ID design: Simple approach to deduplication
  3. Obsidian Plugin API: Understanding proper use of Vault API
  4. TypeScript type gymnastics: Though AI wrote it, I finally understand why types matter

Product Level

  1. UX details matter: Silent sync vs popup makes a huge difference
  2. Path design: Flat > nested, unless there's a clear reason
  3. Backward compatibility: Upgrades shouldn't break existing user data

AI Development Level

  1. Clear requirement descriptions are more important than writing code
  2. AI is a tool, not magic: You need to understand what it's doing
  3. Iteration > perfection: Get it running first, then optimize
  4. 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:

  1. Fork it
  2. Let AI help you modify it
  3. 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.



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

Get Notes to Obsidian Importer 2.0 - Note Migration in the All-in AI Era | 原子比特之间