
Hey everyone,
I’m Supreeth C, aslo known as ShinichiShi, a GSoC 2026 contributor for the project “Vue Simulator Integration”. This blog highlights the work completed during the first half of the GSoC coding period, including key fixes and improvements made to the Vue Simulator.
CircuitVerse has been running its legacy simulator for years while a full Vue.js rewrite (VueSim) sat nearly finished but unreleased, held back by a long tail of small bugs and an authentication flow that didn’t play well with the rest of the platform. This project aims to close that gap: stabilize VueSim so it can actually ship, and make sure users can log in cleanly and securely wherever they run CircuitVerse, in the browser or through the native Tauri desktop app.
Phase 1 was about the essential work of bug-hunting and getting authentication right, since neither of those can be retrofitted cheaply once a rewrite goes live.
Community bonding period doubled as a Mergathon, an internal CircuitVerse event to clear out the backlog of stale and duplicate PRs/issues across the organization’s four repositories: the main app, the Vue simulator, the interactive book, and the mobile app. Naman and I worked together and spent the week clearing out old PRs, which turned out to be a great way to get familiar with the codebase before beginning the planned feature work. We led the leaderboard for most of the week and ultimately finished second, narrowly missing the top spot, but the repositories were meaningfully cleaner, which was the actual goal.
By the time coding officially began, we had already developed a working mental map of the codebase, which paid off immediately once bug-hunting started.
Week one focused entirely on QA: finding and fixing the bugs standing between VueSim and a public release. We raised around eight PRs against the Vue simulator over the following weeks, the more notable ones being:
JSON.stringify footgun where some data was being stored as a stringified string instead of a proper object, which broke downstream parsing.Weeks 2 and 3 were lighter on code since they overlapped with my semester-end exams. We front-loaded work where possible and caught up around the exam schedule with the mentors’ support.
The most significant change of this stretch was moving VueSim’s login away from a custom modal to CircuitVerse’s existing Rails Devise login form. Google and GitHub OAuth need a real browser context to complete their redirect flow, something a custom modal can’t provide. Routing through the existing Devise form meant reusing infrastructure that was already battle-tested, then simply picking up the session cookie once the user authenticated.
This is also where we went down a rabbit hole on what “logging out” actually means for a JWT-based session: a JWT is stateless, so deleting a client-side cookie doesn’t revoke the token itself. A robust logout flow can pair a short-lived access token with a server-side-revocable refresh token; otherwise, a copied access token may remain valid until it expires regardless of what the browser does.
With web auth settled, we moved to authentication for the Tauri desktop app, a materially harder problem since we could not rely on the same browser session-cookie flow or safely embed a client secret. We evaluated two variants of the OAuth Authorization Code + PKCE flow: one using a loopback localhost server to catch the redirect, the other using a custom URI scheme (circuitverse://callback). Both need the desktop app to open a browser for login and exchange an auth code for a token afterward; they differ only in how that code gets handed back to the app.
Getting PKCE right meant understanding exactly what it protects against: an intercepted authorization code. The app generates a code_verifier, sends only its hash (code_challenge) up front, and later proves possession of the original secret when exchanging the code for a token. We also mapped out how state, nonce, and PKCE each guard a different failure mode (CSRF, ID-token replay, and code interception respectively), since they’re often mentioned together but solve distinct problems.
This sprint was less about new code and more about tightening what already existed. The open PRs went through detailed mentor review, and a good chunk of the week went into responding to review feedback and iterating, a rhythm that’s been genuinely useful for catching things we might otherwise have missed.
We also made a deliberate call to pause the from-scratch Tauri OAuth implementation. Partway through wiring up poll codes and token exchange, it became clear we were re-solving a problem that established, well-tested patterns already handle. Rather than push forward and rediscover edge cases the hard way, we are parking it until after the mid-term evaluation to revisit with an established pattern instead of a hand-rolled one.
Meanwhile, VueSim’s web authentication PR is up for review, and once merged, that clears the last major blocker standing between the rewrite and a real release.
We addressed a cluster of independent, release-blocking bugs: a JSON serialization issue, circuit previews not being visible on the dashboard, saving circuits in the .cv format, and a build-pipeline gap that silently dropped required web fonts. None were individually large, but collectively they marked the difference between VueSim being an internal preview and something CircuitVerse can put in front of every user.
Login for both the main app and VueSim now goes through the same Rails Devise flow, giving OAuth providers the real browser redirect context they need.
We explored an OAuth Authorization Code + PKCE flow for the desktop client, currently paused in favor of adopting an established implementation pattern rather than a custom one, with plans to revisit it in Phase 2.
This video shows the fixes made through this project in the first phase :
Thanks to the CircuitVerse community and to my mentors, Nihal Rajpal, Arnab Das and Niladri Adhikary for the consistent reviews and guidance through this phase. We look forward to getting VueSim shipped and Tauri authentication done right in Phase 2.