posted an update

What’s New: Web apps are sandboxed and cannot access local folders. Instead of forcing developers to manually copy-paste paths, we integrated a native Windows Directory Dialog. How it Evolved: We initially tried running tkinter directly in the server process, but it blocked uvicorn's event loop in headless environments. We solved this by shifting the UI execution into an isolated PowerShell subprocess:

python

app/services.py

import subprocess def open_native_picker(): ps_script = ( "[void][System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); " "$dialog = New-Object System.Windows.Forms.FolderBrowserDialog; " "$dialog.Description = 'Select Project Folder'; " "$dialog.ShowNewFolderButton = $true; " "$result = $dialog.ShowDialog(); " "if ($result -eq 'OK') { Write-Output $dialog.SelectedPath }" ) completed = subprocess.run( ["powershell", "-NoProfile", "-Command", ps_script], capture_output=True, text=True, timeout=60 ) return completed.stdout.strip()

  1. React 19 Client-Side Hydration Interceptor What’s New: In modern browsers like Brave, ad-blockers inject custom attributes (bis_skin_checked="1") into hidden div tags generated by Next.js's metadata managers. Since this happens on the client before React loads, it triggers a fatal React 19 hydration mismatch overlay. How it Evolved: We refactored the homepage to load dynamically with ssr: false and implemented a client-side interceptor that filters out extension-related warning logs:

typescript

// src/app/MigrationConsole.tsx if (typeof window !== "undefined") { const origError = console.error; console.error = function (...args) { if (args[0] && typeof args[0] === 'string' && ( args[0].includes('hydration') || args[0].includes('bis_skin_checked') )) { return; // Silences Brave ad-blocker DOM mismatch overlays } origError.apply(console, args); }; }

  1. Handling AI "Thinking" Streams What’s New: When using Claude Sonnet 5, the model generates structured ThinkingBlocks alongside standard TextBlocks to process code logic. The previous API parser expected text directly on message.content[0], causing crashes when thinking was returned. How it Evolved: We updated our Anthropic response parsing to dynamically search and extract text blocks:

python

app/services.py

Extract text content safely from all text blocks, skipping ThinkingBlocks

content = "".join([ block.text for block in message.content if getattr(block, "type", None) == "text" or hasattr(block, "text") ]).strip() Future Roadmap: Interactive Dependency Graph: Render AST-based maps of how files connect. Semgrep CI/CD Integration: Automatically run containerized security checks before and after AI modernization. Feel free to leave a comment below! What features would you like to see next in the O2N Engine?

Log in or sign up for Devpost to join the conversation.