{"slug": "vibe-coding-open-core-out-of-its-lockbox-ii-may-the-fork-be-with-you", "title": "Vibe Coding Open Core Out of its Lockbox II: May the Fork Be With You", "summary": "A developer forked the open-source Meetily v0.4.0 codebase into a new project called LibreMeet, rebranding 73 files and removing 928 lines of PostHog analytics infrastructure to create a privacy-first alternative. The fork, executed via real commands and diffs, strips telemetry and renames all occurrences of the original project while preserving attribution files as required by the MIT license.", "body_md": "Part 1 laid out the roadmap: here’s what’s gated, here’s what it would take to ungates it, and here’s a worked example of how an AI coding agent turns a spec into real code. This part is the actual fork. Not a thought experiment. Not a hypothetical. Real commands, real diffs, real output.\n\n## Cloning and Branching[#](#cloning-and-branching)\n\nThe starting point is the Meetily v0.4.0 MIT codebase. Clone it, create a branch with the fork’s name, and get ready to break things.\n\n```\ngit clone https://github.com/Zackriya-Solutions/meetily.git libremeet\ncd libremeet\ngit checkout -b libremeet-rebrand\n```\n\nThe MIT license requires keeping the original copyright notice. Everything else is fair game.\n\n## The Rebrand: 69 Files, Zero Remainders[#](#the-rebrand-69-files-zero-remainders)\n\nThe first thing any fork needs is its own name. The MIT license lets you take the code, but the project’s name, logo, and brand identity belong to the original authors. The first commit of any fork is a search-and-replace across the entire codebase.\n\nI counted: 161 occurrences of “Meetily” across 55 files. That includes:\n\n- The Tauri bundle identifier (\n`com.meetily.ai`\n\n) - macOS Info.plist and entitlements\n- The Docker compose service names\n- Build scripts, installers, and CI workflows\n- Rust struct names and module declarations\n- Over a dozen frontend components and hooks\n- Notification configuration, logging headers, debug strings\n\nThe replacement patterns:\n\n| Pattern | Replacement |\n|---|---|\n`Meetily` | `LibreMeet` |\n`meetily` | `libremeet` |\n`com.meetily.ai` | `com.libremeet.app` |\n\nI skipped the attribution files (`README.md`\n\n, `CONTRIBUTING.md`\n\n, `PRIVACY_POLICY.md`\n\n, `LICENSE.md`\n\n) because those reference the upstream project by name. Everything else got the treatment.\n\nThe result, in one commit:\n\n```\n73 files changed, 223 insertions, 223 deletions\n```\n\nEvery replaced string was exactly the same length as its replacement. No formatting drift, no table alignment broken. That’s not always going to be the case, but it makes for a clean diff.\n\nThe moment of truth came after the last file was patched:\n\n```\ngrep -rn '\\bMeetily\\b' --include='*.rs' --include='*.tsx' --include='*.ts'\n  --exclude='README.md' --exclude='CONTRIBUTING.md' --exclude='PRIVACY_POLICY.md'\n```\n\nZero matches. The fork had its first commit.\n\n## Stripping PostHog: -928 Lines[#](#stripping-posthog--928-lines)\n\nThere’s an important early step that I missed in Part 1: the MIT codebase ships with PostHog analytics infrastructure. Three files in `frontend/src-tauri/src/analytics/`\n\n, 32KB of code, 24 Tauri command registrations, and a hardcoded API key pointing to `us.i.posthog.com`\n\n.\n\nIf your pitch is “privacy-first,” you can’t ship with telemetry built in, even if it’s disabled by default. This has to go.\n\nRemoving the analytics module meant:\n\n- Delete the three analytics source files\n- Remove\n`pub mod analytics;`\n\nfrom`lib.rs`\n\n- Strip all 24 analytics command registrations from the Tauri invoke handler\n- Remove the\n`posthog-rs`\n\ndependency from`Cargo.toml`\n\nThe commit diff tells the story:\n\n```\n5 files changed, 1 insertion(+), 928 deletions(-)\n delete mode 100644 frontend/src-tauri/src/analytics/analytics.rs\n delete mode 100644 frontend/src-tauri/src/analytics/commands.rs\n delete mode 100644 frontend/src-tauri/src/analytics/mod.rs\n```\n\n928 lines of telemetry infrastructure, gone. The frontend analytics client library (`analytics.ts`\n\n) and its call sites remain. They invoke Tauri commands that no longer exist. That’s technical debt for the next commit. But the Rust backend, the Tauri command registry, and the build dependencies are clean.\n\nThis is the fork’s first real editorial decision. The original authors built telemetry because they needed product data to improve the app. The fork is saying: that’s a valid tradeoff, but it’s not ours. Our users get the inverse: no data leaves their machine, and in exchange they accept that we’re flying a bit more blind.\n\n## The First Feature: Template Editor, One Pass[#](#the-first-feature-template-editor-one-pass)\n\nPart 1’s roadmap listed “Template editor UI” as a Low-Medium effort. The Rust scaffolding is complete: a three-tier fallback chain (custom templates on disk, bundled templates in app resources, built-in templates embedded in the binary), JSON validation, a `validate_template`\n\ncommand explicitly designed to support a frontend editor. Only the frontend UI was missing.\n\nI wrote a spec:\n\n```\n# SDD: Template Editor UI for LibreMeet\n\n## Goal\nAdd a visual template editor UI that lets users create, edit, preview,\nand delete custom summary templates. The Rust backend already has the\ncomplete template framework. This spec is for the frontend UI only.\n\n## Scope\n- New Tauri commands: `api_save_custom_template` and\n  `api_delete_custom_template`\n- New dialog component: `TemplateEditorDialog.tsx`\n- \"Manage Templates\" button in the existing button group\n- Template sections: add, edit, reorder, delete\n\n## Constraints\n- Reuse existing shadcn/ui components\n- No new npm packages\n```\n\nThen I fed it to droid:\n\n```\ndroid exec --use-spec --auto high --worktree libremeet-template-editor \\\n  -f /tmp/libremeet-template-editor-spec.md\n```\n\nIt completed in one pass. Here’s what it produced:\n\n**Backend (4 files modified):**\n\n- Added a public\n`get_templates_dir()`\n\nwrapper around the existing private function in`loader.rs`\n\n- Exported it through the templates module\n- Added\n`api_save_custom_template`\n\nand`api_delete_custom_template`\n\ncommands to`template_commands.rs`\n\n, complete with validation before write and confirmation before delete - Registered the new commands in the Tauri invoke handler\n\n**Frontend (5 files modified + 1 new):**\n\n- A new\n`TemplateEditorDialog.tsx`\n\nat 670 lines: two-panel layout with a template list on the left and an editor form on the right - The left panel shows all available templates with badges for built-in vs custom, edit and delete actions on hover, and a “New Template” button\n- The right panel has fields for name, description, and a dynamic sections list where you can add, remove, reorder, and edit each section’s title, instruction, and format\n- Local validation before save, backend validation via the existing\n`api_validate_template`\n\ncommand, and unsaved-changes protection on close - Wiring through the button group and summary panel to the existing template selector\n\nThe diff:\n\n```\n9 files changed, 249 insertions(+), 45 deletions(-)\n```\n\nOne spec, one command, 670 lines of React, 155 lines of Rust, a complete feature that was locked behind the Pro paywall. This took less than an hour of my time and pennies of inference tokens. And now I own it forever. I’m not renting it. It’s mine. Bought and paid for.\n\n## The Build (or Lack Thereof)[#](#the-build-or-lack-thereof)\n\nThis is the part where theory meets practice. The rebrand was a string replacement. The analytics removal deleted dead code. The template editor commands are thin wrappers around existing infrastructure. But none of that matters if the code doesn’t compile.\n\nSetting up the Rust toolchain takes exactly one command:\n\n```\nbrew install rust\n```\n\nThen you run `cargo check`\n\nand watch it fail because the next missing dependency surfaces. In this case: cmake, needed by whisper.cpp to compile the speech-to-text engine.\n\n```\nbrew install cmake\n```\n\nThen `cargo check`\n\ngets further but fails again. This time because the llama-helper sidecar binary doesn’t exist at the expected path. The rebrand renamed the app but not every reference to the build artifact. Another real fork friction point. The fix: compile the sidecar from the repo and place it where the build scripts expect it.\n\n```\ncd llama-helper && cargo build --release\nmkdir -p frontend/src-tauri/binaries\ncp target/release/llama-helper \\\n   frontend/src-tauri/binaries/llama-helper-aarch64-apple-darwin\n```\n\nThen `cargo check`\n\ngets even further before revealing the last lingering reference to the deleted analytics module. One orphaned `crate::analytics::commands::track_meeting_ended`\n\ncall in `recording_commands.rs`\n\n. A quick patch.\n\nThen:\n\n```\ncargo check\n```\n\nNo errors. 19 warnings, 14 of them auto-fixable. The fork compiles.\n\nThat’s the moment. The code has its own name, its own commits, its first new feature, and a clean build. Three missing tools, one orphaned reference, and about fifteen minutes of iteration. This is what actually happens when you fork a real codebase. It’s not magic. It’s just grinding through the dependency chain until the compiler is satisfied.\n\nThe next step (setting up CI, wrestling with macOS code signing, and turning the source into a shippable binary) belongs in the next article in this series.\n\n## What This Actually Proves[#](#what-this-actually-proves)\n\nThree hours of work produced:\n\n- A rebranded codebase with zero remaining references to the original name\n- A stripped analytics layer removing 928 lines of telemetry\n- A complete template editor UI with backend save/delete, generated from a spec in one droid pass\n\nNone of this required access to the Pro codebase. None of it required reverse engineering. It was all there, in the MIT source, waiting for someone to connect the pieces. The vibe coding loop (write a spec, delegate to an AI agent, verify the output) turned a feature that was behind a paywall into a working implementation in the time it takes to watch a TV show.\n\nThe fork took longer to describe than to execute.\n\nIn Part 3, I’ll build the binary and tackle the genuinely hard problems: speaker diarization, meeting auto-detection, and the RAG pipeline that even Meetily Pro hasn’t shipped yet. The roadmap from Part 1 had those down as Very High effort. Let’s find out if that’s accurate.\n\nBetween now and then, if this is important to you, here are some things to think about: setting up CI for multi-platform Tauri builds, deciding whether to keep or replace the llama-helper sidecar for local AI, and whether the fork should stay a desktop app or grow a web UI for teams. The code is at `/tmp/meetily-libremeet`\n\non my machine. Fork it, build it, make it yours.", "url": "https://wpnews.pro/news/vibe-coding-open-core-out-of-its-lockbox-ii-may-the-fork-be-with-you", "canonical_source": "https://magnus919.com/2026/07/vibe-coding-open-core-out-of-its-lockbox-ii-may-the-fork-be-with-you/", "published_at": "2026-07-04 18:00:00+00:00", "updated_at": "2026-07-10 14:45:56.512364+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools"], "entities": ["Meetily", "LibreMeet", "PostHog", "Zackriya-Solutions", "Tauri"], "alternates": {"html": "https://wpnews.pro/news/vibe-coding-open-core-out-of-its-lockbox-ii-may-the-fork-be-with-you", "markdown": "https://wpnews.pro/news/vibe-coding-open-core-out-of-its-lockbox-ii-may-the-fork-be-with-you.md", "text": "https://wpnews.pro/news/vibe-coding-open-core-out-of-its-lockbox-ii-may-the-fork-be-with-you.txt", "jsonld": "https://wpnews.pro/news/vibe-coding-open-core-out-of-its-lockbox-ii-may-the-fork-be-with-you.jsonld"}}