<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Akanksha Trehun</title>
    <description>The latest articles on DEV Community by Akanksha Trehun (@magic-peach).</description>
    <link>https://dev.to/magic-peach</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3909309%2F540870bc-2796-4ade-a0dd-68e2fce4e1c2.png</url>
      <title>DEV Community: Akanksha Trehun</title>
      <link>https://dev.to/magic-peach</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/magic-peach"/>
    <language>en</language>
    <item>
      <title>Week 2: Pull Requests, Rejected Code, and the Art of Not Breaking Things</title>
      <dc:creator>Akanksha Trehun</dc:creator>
      <pubDate>Sat, 13 Jun 2026 15:53:27 +0000</pubDate>
      <link>https://dev.to/magic-peach/week-2-pull-requests-rejected-code-and-the-art-of-not-breaking-things-mcf</link>
      <guid>https://dev.to/magic-peach/week-2-pull-requests-rejected-code-and-the-art-of-not-breaking-things-mcf</guid>
      <description>&lt;p&gt;&lt;em&gt;GSoC 2026 | CircuitVerse × Canvas LMS LTI 1.3 Integration&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;If Week 1 was about getting familiar with the codebase and understanding what needed to be built, Week 2 was about learning the hard way that writing code is only half the job. The other half — the messier, more humbling half — is getting that code accepted by the people who actually maintain the project.&lt;/p&gt;

&lt;p&gt;This week was full of detours, rejected pull requests, reviewer feedback that stung a little, and a surprisingly frustrating fight with a two-letter word in Ruby. But by the end of it, I had something real to show: a clean, reviewed, and submitted change to CircuitVerse that lays the foundation for the entire LTI 1.3 integration. Let me walk you through it.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Quick Refresher: What Are We Building?
&lt;/h2&gt;

&lt;p&gt;CircuitVerse is an open-source platform where students can build and simulate digital circuits right in their browser. The project I'm working on aims to connect CircuitVerse with Canvas, one of the most widely used Learning Management Systems (LMS) in universities around the world.&lt;/p&gt;

&lt;p&gt;The technology that makes this connection possible is called &lt;strong&gt;LTI&lt;/strong&gt; — Learning Tools Interoperability. Think of it as a universal plug that lets any educational tool (like CircuitVerse) slot into any LMS (like Canvas) so that students can log in once, get assignments, submit work, and have their grades flow back automatically — all without leaving their course page.&lt;/p&gt;

&lt;p&gt;There are two versions of this plug: &lt;strong&gt;LTI 1.1&lt;/strong&gt;, which is old and uses a simpler (but outdated) security mechanism, and &lt;strong&gt;LTI 1.3&lt;/strong&gt;, which is newer, more secure, and what Canvas actually recommends today. My job is to bring CircuitVerse fully up to LTI 1.3 standards.&lt;/p&gt;




&lt;h2&gt;
  
  
  Monday–Tuesday: A Pull Request That Taught Me to Read Diffs
&lt;/h2&gt;

&lt;p&gt;I started the week with what I thought was a solid pull request (PR) — a fix for a bug in CircuitVerse's existing LTI 1.1 grade passback feature. "Grade passback" is the process where CircuitVerse sends a student's score back to Canvas after they complete an assignment.&lt;/p&gt;

&lt;p&gt;My PR got reviewed, and the reviewer left two comments that immediately made me wince:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment 1:&lt;/strong&gt; &lt;em&gt;"It seems that the whole schema is sorted. This issue has been fixed upstream."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Translation: I had accidentally included a massive, unrelated change to a file called &lt;code&gt;schema.rb&lt;/code&gt; — a file that describes the structure of CircuitVerse's database. When I ran a command to regenerate this file on my laptop, a newer version of the Rails framework (the toolkit CircuitVerse is built on) quietly reordered every single database column alphabetically. This produced a diff with hundreds of changed lines — none of which were related to my actual fix. The reviewer spotted it immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment 2:&lt;/strong&gt; &lt;em&gt;"You are downgrading gem version here."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Translation: I had accidentally rolled back a security upgrade. CircuitVerse uses a library called &lt;code&gt;jwt&lt;/code&gt; (JSON Web Tokens — a way to securely verify identity online) that had recently been upgraded from version 2.x to 3.x. My branch had unknowingly reverted it to the older version because of a chain reaction: another library I'd updated (&lt;code&gt;webpush&lt;/code&gt;, used for browser notifications) happened to be incompatible with jwt 3.x, pulling the version back down without me realising.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Fix:&lt;/strong&gt; I had to undo the schema changes by restoring the file to exactly what the main CircuitVerse codebase had, restore jwt to version 3.2.0, and also downgrade webpush back to the version that didn't cause the conflict. Three files. Careful surgery with git commands. Then push the corrected version, re-commit, and update the PR.&lt;/p&gt;

&lt;p&gt;This taught me something I'll carry for the rest of the summer: &lt;strong&gt;always check your diff before opening a pull request.&lt;/strong&gt; A diff is the list of everything your code changes compared to the original. If anything looks unfamiliar or unexpected, it probably shouldn't be there.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wednesday: The PR I Had to Close
&lt;/h2&gt;

&lt;p&gt;After fixing those issues and updating the pull request, I got some harder news: the PR had to be closed. The grade passback code I'd written depended on an old library (&lt;code&gt;ims-lti&lt;/code&gt;) that used LTI 1.1's way of doing things — OAuth 1.0, an older form of authentication. The problem was that several other files in the project also depended on that same library, and changing it was causing things to break in places I hadn't touched.&lt;/p&gt;

&lt;p&gt;It felt frustrating. But my mentor pointed me in the right direction: before fixing the grade passback flow, I needed to first upgrade the underlying library itself. That meant replacing &lt;code&gt;ims-lti&lt;/code&gt; with something modern that could handle LTI 1.3 properly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wednesday–Thursday: Reviewing Someone Else's Pull Request
&lt;/h2&gt;

&lt;p&gt;While I regrouped, I was asked to review another PR that had been submitted — a Dependabot update (an automated tool that suggests library upgrades) proposing to bump &lt;code&gt;ims-lti&lt;/code&gt; from version 1.2.9 to 2.3.7.&lt;/p&gt;

&lt;p&gt;This was a useful exercise. Looking at what changed between the two versions, I spotted that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The 2.x version had removed support for the OAuth library entirely — the same one that &lt;code&gt;LtiScoreSubmission&lt;/code&gt; (the grade passback code) depended on&lt;/li&gt;
&lt;li&gt;A class called &lt;code&gt;IMS::LTI::ToolProvider&lt;/code&gt;, which is what the controller uses to verify a student's identity when they launch CircuitVerse from Canvas, simply doesn't exist in 2.x&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Merging this PR would have silently broken every LTI launch and every grade submission. I wrote up a review explaining this and recommended the PR be held until the LTI code was properly migrated to 1.3. The PR was not merged.&lt;/p&gt;

&lt;p&gt;Reviewing other people's code with a critical eye is a skill in itself, and this was good practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Thursday: Syncing With the Main Codebase (A Surprisingly Tricky Task)
&lt;/h2&gt;

&lt;p&gt;Before writing any new code, I needed to make sure my local copy of CircuitVerse was up to date with the changes the main team had been making. This process is called "fetching upstream" — pulling in changes from the official CircuitVerse repository.&lt;/p&gt;

&lt;p&gt;It should have been simple. It wasn't.&lt;/p&gt;

&lt;p&gt;Git (the tool developers use to track code changes) threw an error about corrupted branch references — essentially, some branch names in the CircuitVerse repository contained spaces in their names, which git wasn't expecting. These bad references were blocking the entire fetch operation.&lt;/p&gt;

&lt;p&gt;The fix involved tracking down these broken references, deleting them, and then fetching again. Once that worked, I had a new problem: a &lt;strong&gt;merge conflict&lt;/strong&gt;. The main codebase had changed the jwt library version (to 3.2.0), while my local copy still had the older pin (2.10.3). Git didn't know which one to keep, so it stopped and asked me to decide.&lt;/p&gt;

&lt;p&gt;I chose the upstream version (3.2.0) — the right call, since that's the one the maintainers had intentionally upgraded to. I also removed a manually-added entry for a library called &lt;code&gt;faraday&lt;/code&gt; (used for making HTTP requests) since it was already included indirectly through other libraries and didn't need to be declared explicitly.&lt;/p&gt;

&lt;p&gt;There was also a leftover reference to a submodule (a separate mini-repository embedded inside CircuitVerse) that I'd already removed in an earlier session. The merge picked it back up; I removed it again. After all of that, the sync was complete.&lt;/p&gt;




&lt;h2&gt;
  
  
  Friday: Finding the Right Gem — A Detective Story
&lt;/h2&gt;

&lt;p&gt;With the codebase up to date, it was time to research the actual replacement for &lt;code&gt;ims-lti&lt;/code&gt;. The library I'd been asked to migrate to is called &lt;strong&gt;&lt;code&gt;lti_advantage&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's where it got interesting. There are &lt;em&gt;two&lt;/em&gt; different things with very similar names:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;lti_advantage&lt;/code&gt; (version 0.0.3)&lt;/strong&gt; — published on RubyGems (the standard place Ruby libraries are shared), authored by an individual developer, with no publicly accessible source code and almost no documentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;lti-advantage&lt;/code&gt; (version 0.1.0)&lt;/strong&gt; — embedded directly inside Canvas LMS's own codebase, maintained by Instructure (the company that builds Canvas), with full source code, tests, and comments linking to the official LTI standards.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Since the entire point of this integration is to work with Canvas, using the library that &lt;em&gt;Canvas itself uses&lt;/em&gt; was clearly the right call. The Canvas version is battle-tested, actively maintained, and built to the exact same LTI 1.3 specification we're implementing.&lt;/p&gt;

&lt;p&gt;I updated the &lt;code&gt;Gemfile&lt;/code&gt; (the file that lists all libraries a Ruby application depends on) to point to Canvas's version of the gem, directly from the Canvas GitHub repository.&lt;/p&gt;




&lt;h2&gt;
  
  
  Friday Evening: The Two-Letter Word That Cost Me an Hour
&lt;/h2&gt;

&lt;p&gt;After setting up the Gemfile, I ran a quick test to verify the library had loaded correctly. Instead of a confirmation, I got a wall of red error text.&lt;/p&gt;

&lt;p&gt;The culprit? The word &lt;strong&gt;&lt;code&gt;it&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Ruby 3.4 (released late 2023), &lt;code&gt;it&lt;/code&gt; was introduced as a new shorthand inside code blocks — a way to refer to the current item being processed without naming it explicitly. The Canvas team had adopted this syntax in their codebase.&lt;/p&gt;

&lt;p&gt;But CircuitVerse runs on Ruby 3.2.2. In that version, &lt;code&gt;it&lt;/code&gt; isn't a special keyword — it's just an undefined method name. So when the library tried to load, Ruby 3.2.2 hit the word &lt;code&gt;it&lt;/code&gt; and said: &lt;em&gt;"I have no idea what this is."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The solution was to find the specific point in Canvas's git history just before this syntax was introduced — a commit from March 2025, before the Canvas team upgraded their Rubocop linting tool to support Ruby 3.4 style. By pinning our Gemfile to that specific historical commit, we get the full functionality of the library without the Ruby version incompatibility.&lt;/p&gt;

&lt;p&gt;After making that change, the verification check finally printed what I needed to see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.1.0
LtiAdvantage::Messages::ResourceLinkRequest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The library was in, working, and ready.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up: 793 Tests, 0 Failures
&lt;/h2&gt;

&lt;p&gt;With the new library loaded, the last step was making sure I hadn't accidentally broken anything else in the process. I ran CircuitVerse's full test suite — 793 individual automated tests covering models, controllers, API endpoints, background jobs, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;793 examples, 0 failures.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every part of the existing application still worked exactly as before. The only test excluded from this run was the one specifically for LTI — which I already knew would fail, because it still references the old library. Rewriting that test is part of next week's work.&lt;/p&gt;

&lt;p&gt;I created a clean pull request with a single, focused commit describing exactly what changed and why, linked it to the issue (#7509) I'd opened for the work, and submitted it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Learned This Week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read your diffs.&lt;/strong&gt; Every line in a pull request should be there intentionally. Unexpected changes are usually a sign something went wrong.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Library upgrades are never just library upgrades.&lt;/strong&gt; Every dependency has dependencies of its own, and changing one can quietly shift others.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewing code is as valuable as writing it.&lt;/strong&gt; Catching a breaking change before it merges is just as important as shipping a feature.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Version numbers matter — down to the commit.&lt;/strong&gt; Pinning a library to a specific historical commit felt overly cautious at first, but it was the only correct solution given the Ruby version gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A clean pull request with one clear purpose is worth far more than a large one with many.&lt;/strong&gt; My first PR of the week was rejected partly because it accidentally carried in unrelated changes. The PR at the end of the week had exactly one commit, one purpose, and zero noise.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Next week: I start the actual code migration — replacing the old LTI 1.1 authentication logic with the new &lt;code&gt;lti-advantage&lt;/code&gt; library's APIs, rewriting the tests, and wiring up the full OIDC launch flow that Canvas LTI 1.3 requires.&lt;/p&gt;

&lt;p&gt;The foundation is set. Time to build.&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>git</category>
      <category>opensource</category>
      <category>ruby</category>
    </item>
    <item>
      <title>GSoC 2026 · Week 1 — What Happens When a Student Clicks "Open Assignment"?</title>
      <dc:creator>Akanksha Trehun</dc:creator>
      <pubDate>Sat, 06 Jun 2026 17:46:44 +0000</pubDate>
      <link>https://dev.to/magic-peach/gsoc-2026-week-1-what-happens-when-a-student-clicks-open-assignment-1jk4</link>
      <guid>https://dev.to/magic-peach/gsoc-2026-week-1-what-happens-when-a-student-clicks-open-assignment-1jk4</guid>
      <description>&lt;h3&gt;
  
  
  Testing the LMS–LTI integration in CircuitVerse
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A behind-the-scenes look at debugging a silent integration — and what it taught me about the gap between code that exists and code that works.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; CircuitVerse · &lt;strong&gt;Week:&lt;/strong&gt; 1 · &lt;strong&gt;Focus:&lt;/strong&gt; Testing &amp;amp; fixing the LMS–LTI assignment workflow&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;In my first week, I tested the full LMS–LTI flow end to end — a student opening an assignment from Canvas, building a circuit in CircuitVerse, and a teacher grading it back in Canvas. On the surface the feature looked complete. In reality, &lt;strong&gt;four interconnected bugs&lt;/strong&gt; were silently breaking the handoff. Here's how I found and fixed each one.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;Root cause&lt;/th&gt;
&lt;th&gt;Fix&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Student hit a login page&lt;/td&gt;
&lt;td&gt;Session was never established after launch&lt;/td&gt;
&lt;td&gt;Add &lt;code&gt;sign_in(@user)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Student landed on the wrong page&lt;/td&gt;
&lt;td&gt;Redirect pointed at the group home, not the project&lt;/td&gt;
&lt;td&gt;Redirect to &lt;code&gt;user_project_path&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Teacher couldn't grade&lt;/td&gt;
&lt;td&gt;Grading form hidden until deadline passes&lt;/td&gt;
&lt;td&gt;Allow past deadlines for testing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Grade showed &lt;code&gt;0&lt;/code&gt; in Canvas&lt;/td&gt;
&lt;td&gt;Feature flag off, missing LTI session, &lt;code&gt;maxPoints = 0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Enable flag, launch via Canvas, set max points&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  First, some context: what is LMS–LTI?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LMS&lt;/strong&gt; stands for &lt;strong&gt;Learning Management System&lt;/strong&gt; — the software your university uses to manage courses, post assignments, and track grades. Canvas, Moodle, Google Classroom, and Blackboard are all examples.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LTI&lt;/strong&gt; stands for &lt;strong&gt;Learning Tools Interoperability&lt;/strong&gt; — an industry standard that lets an LMS talk to an external tool like CircuitVerse, so students don't need separate accounts or a second login. In theory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A student clicks a link inside Canvas and is transported directly into CircuitVerse, identity already known.&lt;/li&gt;
&lt;li&gt;The teacher grades the work from Canvas.&lt;/li&gt;
&lt;li&gt;The score flows back automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In practice, making that seamless handoff actually work is where things get interesting.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Setting up the test
&lt;/h2&gt;

&lt;p&gt;Before any real testing could happen, I needed two systems running side by side and talking to each other. So I set up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A local &lt;strong&gt;Canvas&lt;/strong&gt; instance and a local &lt;strong&gt;CircuitVerse&lt;/strong&gt; instance.&lt;/li&gt;
&lt;li&gt;A test course in Canvas, with a &lt;strong&gt;test student&lt;/strong&gt; and a &lt;strong&gt;test teacher&lt;/strong&gt; enrolled.&lt;/li&gt;
&lt;li&gt;An LTI assignment configured to point at CircuitVerse.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With everything in place, I logged in as the student and clicked the assignment link.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug 1: the student ended up on the login page
&lt;/h2&gt;

&lt;p&gt;The first screenshot told the whole story. Instead of landing in CircuitVerse on the assignment, the student was redirected to &lt;code&gt;/users/sign_in&lt;/code&gt; — CircuitVerse's standard login page.&lt;/p&gt;

&lt;p&gt;The LTI handoff itself had worked. Canvas had sent all the right information to CircuitVerse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Who&lt;/strong&gt; the student was&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which course&lt;/strong&gt; they were in&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Which assignment&lt;/strong&gt; they were opening&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CircuitVerse read that information, found the matching user, and even created a blank project for the student to fill in. But it never told CircuitVerse's authentication system that the student was now logged in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of it like a hotel. The front desk checked your reservation, confirmed your identity, and handed you a room key — but forgot to actually activate the key. Every door you try still says "access denied."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The fix was a single line in the code that handles student LTI launches:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;sign_in&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding this before showing the student their assignment established the session properly. After this fix, the student landed &lt;strong&gt;authenticated and ready&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug 2: the student landed on the wrong page
&lt;/h2&gt;

&lt;p&gt;With authentication fixed, the student was now signed in — but being sent to a course overview page with no obvious path to their actual assignment. The intermediate "please wait" page CircuitVerse shows during the handoff was opening a new browser tab pointing at the &lt;strong&gt;group's home page&lt;/strong&gt;, not the student's specific work.&lt;/p&gt;

&lt;p&gt;The fix was conceptually simple: redirect the student straight to the project that was auto-created for them during the launch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Before: took the student to the course home page&lt;/span&gt;
&lt;span class="n"&gt;group_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@group&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# After: takes the student straight to their project&lt;/span&gt;
&lt;span class="n"&gt;user_project_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vi"&gt;@project&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now when the student's browser opens the new tab, they land on their own project page with a clear &lt;strong&gt;"Launch Simulator"&lt;/strong&gt; button waiting for them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug 3: the teacher could not grade
&lt;/h2&gt;

&lt;p&gt;With the student flow working, I switched to the teacher's perspective. The teacher launches the same LTI assignment from Canvas, lands on the assignment management page, and can see the student's submission — the circuit they built — in a preview panel.&lt;/p&gt;

&lt;p&gt;But there was &lt;strong&gt;no grading form&lt;/strong&gt;. Nowhere to enter a score.&lt;/p&gt;

&lt;p&gt;This one required reading the code rather than guessing. The grading form is deliberately hidden until the assignment's deadline has passed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;can_be_graded?&lt;/span&gt;
  &lt;span class="n"&gt;mentor_access?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;assignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;graded?&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assignment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deadline&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="no"&gt;Time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;current&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;negative?&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The last condition — &lt;code&gt;negative?&lt;/code&gt; — means the deadline must be in the past. My test assignment had a deadline set a week in the &lt;strong&gt;future&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The logic makes sense for real classrooms: you don't want teachers accidentally grading before students have finished submitting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There was also a secondary problem: the date picker on the assignment edit form had a &lt;code&gt;minDate&lt;/code&gt; restriction that prevented selecting any past date — so even if you knew the workaround, the UI would reset your choice.&lt;/p&gt;

&lt;p&gt;Both restrictions were removed for the editing flow, allowing a past deadline for testing. Once the deadline was in the past, the grading form &lt;strong&gt;appeared immediately&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bug 4: the grade did not appear in Canvas
&lt;/h2&gt;

&lt;p&gt;This was the most layered problem of the four, and the most instructive.&lt;/p&gt;

&lt;p&gt;After the teacher submitted a grade of &lt;strong&gt;68&lt;/strong&gt; in CircuitVerse, I went to the Canvas gradebook expecting to see 68. Instead, it showed &lt;strong&gt;0&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A grade of zero when you entered 68 is never a simple problem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I pulled the Rails server logs to see exactly what happened on submission:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST "/grades"
Parameters: {"grade"=&amp;gt;{"project_id"=&amp;gt;"15", "assignment_id"=&amp;gt;"19",
             "grade"=&amp;gt;"68", "remarks"=&amp;gt;"average"}}
...
Completed 200 OK
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The grade was saved successfully in CircuitVerse — but there was &lt;strong&gt;no outgoing HTTP request to Canvas&lt;/strong&gt; anywhere in the log. The code that should have sent the grade back was never reached.&lt;/p&gt;

&lt;p&gt;Three conditions had to be true &lt;em&gt;simultaneously&lt;/em&gt; for the grade passback to fire:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A feature flag called &lt;code&gt;lms_integration&lt;/code&gt; had to be enabled.&lt;/strong&gt; CircuitVerse uses feature flags to toggle capabilities without deploying new code. This one was off by default. Running &lt;code&gt;Flipper.enable(:lms_integration)&lt;/code&gt; in the server console switched it on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The teacher had to have launched via Canvas LTI before grading.&lt;/strong&gt; The passback code checks &lt;code&gt;session[:is_lti]&lt;/code&gt; — a marker that says "this session started from an LTI launch." Logging into CircuitVerse directly never set it. The fix: always initiate grading from Canvas by clicking &lt;strong&gt;"Load LTI test in a new window."&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Canvas assignment had zero maximum points.&lt;/strong&gt; LTI sends scores as a decimal between 0 and 1 — so 68 out of 100 becomes &lt;code&gt;0.68&lt;/code&gt;. Canvas multiplies that by the assignment's max points:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;With max points &lt;code&gt;0&lt;/code&gt; → &lt;code&gt;0.68 × 0 = 0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;With max points &lt;code&gt;100&lt;/code&gt; → &lt;code&gt;0.68 × 100 = 68&lt;/code&gt; ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After resolving all three, the Canvas gradebook finally showed &lt;strong&gt;68 out of 100&lt;/strong&gt; for the test student.&lt;/p&gt;




&lt;h2&gt;
  
  
  What made this hard
&lt;/h2&gt;

&lt;p&gt;None of these bugs announced themselves loudly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The server returned &lt;strong&gt;success codes&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Pages &lt;strong&gt;loaded&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No errors&lt;/strong&gt; appeared on screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The student reached CircuitVerse — just not authenticated. The grade was saved — just not forwarded. The grading form existed in the code — just not rendered.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is the particular difficulty of integration testing: two systems each behaving correctly on their own, but the handoff between them silently failing. The only way to catch it is to walk through the entire experience from beginning to end, as an actual user would.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The lesson is simple but easy to forget:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A feature is not done when the code is written. It is done when a real person can use it from start to finish without needing to know what is happening underneath.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The moment it worked
&lt;/h2&gt;

&lt;p&gt;After all of the above, I went back to Canvas, clicked the LTI assignment as the teacher, entered a grade of 68, and reloaded the gradebook.&lt;/p&gt;

&lt;p&gt;It showed &lt;strong&gt;68 out of 100&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That number, small and unremarkable on its own, represented a complete round trip:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A student identity handed from Canvas to CircuitVerse&lt;/li&gt;
&lt;li&gt;A circuit built and saved&lt;/li&gt;
&lt;li&gt;A grade entered by a teacher&lt;/li&gt;
&lt;li&gt;A score carried back to where the course lives&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;The workflow works. Now the real work begins — &lt;strong&gt;upgrading it from LTI 1.1 to the more secure and capable LTI 1.3.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks for reading my Week 1 update. More to come as the LTI 1.3 migration gets underway.&lt;/em&gt; 🌸&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>career</category>
      <category>github</category>
    </item>
    <item>
      <title>Getting Selected — The Night I Couldn't Sleep</title>
      <dc:creator>Akanksha Trehun</dc:creator>
      <pubDate>Tue, 12 May 2026 04:37:40 +0000</pubDate>
      <link>https://dev.to/magic-peach/getting-selected-the-night-i-couldnt-sleep-596j</link>
      <guid>https://dev.to/magic-peach/getting-selected-the-night-i-couldnt-sleep-596j</guid>
      <description>&lt;p&gt;If you haven't read my previous post about the pre-GSoC journey the two months of contributing, the early mornings, the proposal drafts I'd suggest starting there. This post picks up right where that one ended: the proposal had been submitted, the deadline had passed, and there was nothing left to do but wait.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Waiting, as it turns out, is its own kind of difficult.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  After the Submission
&lt;/h2&gt;

&lt;p&gt;I hit submit at &lt;strong&gt;11:20 PM on March 31st&lt;/strong&gt;, ten minutes before the deadline. And then, almost immediately, the adrenaline wore off and a very different feeling took its place.&lt;/p&gt;

&lt;p&gt;When you're in the middle of writing a proposal, you have something concrete to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sections to draft&lt;/li&gt;
&lt;li&gt;Diagrams to make&lt;/li&gt;
&lt;li&gt;Timelines to think through&lt;/li&gt;
&lt;li&gt;Drafts to improve&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The work itself keeps the anxiety at a manageable level because you can always channel it into &lt;em&gt;doing something&lt;/em&gt;. But the moment the submission is in and there's nothing more you can do to improve your chances, &lt;strong&gt;the anxiety has nowhere to go. It just sits there.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I kept contributing to CircuitVerse during the waiting period. Partly because I genuinely wanted to stay involved, and partly because it gave me something productive to do instead of refreshing my email. It was the right instinct. Staying active meant I was still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building context in the codebase&lt;/li&gt;
&lt;li&gt;Building relationships in the community&lt;/li&gt;
&lt;li&gt;Becoming a better contributor regardless of what the outcome would be&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I'm not going to pretend the nervousness wasn't real. It was. Every time I thought about the results, there was a knot of uncertainty that I couldn't quite reason away.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Message on April 10th
&lt;/h2&gt;

&lt;p&gt;On &lt;strong&gt;April 10th&lt;/strong&gt;, I got a message from one of the mentors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;I had been shortlisted for an interview round.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I remember reading it twice, just to make sure I had understood correctly. Someone had read my proposal and thought it was worth having a conversation about. That felt significant, and it was.&lt;/p&gt;

&lt;p&gt;It also meant a whole new category of nervousness had arrived. I had no idea what the interview would look like. Would it be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Highly technical&lt;/em&gt; — testing my knowledge of the codebase in detail?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Proposal-focused&lt;/em&gt; — asking me to defend my timeline and technical approach?&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Background-focused&lt;/em&gt; — asking about my prior contributions and understanding of the project history?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn't know, and not knowing made it hard to prepare efficiently. &lt;strong&gt;You can't study for an exam when you don't know what subjects it covers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What I decided to do was prepare for everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three to Four Days of Preparation
&lt;/h2&gt;

&lt;p&gt;I had roughly &lt;strong&gt;three to four days&lt;/strong&gt; between finding out about the interview and actually sitting down to do it. I used all of them.&lt;/p&gt;

&lt;p&gt;Here's exactly what I covered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Revisited the entire codebase&lt;/strong&gt; — not just the parts I had contributed to, but the broader architecture: how the different components connected, what the data models looked like, how requests flowed through the system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviewed every contribution I had made since February&lt;/strong&gt; — not just &lt;em&gt;what&lt;/em&gt; the changes were, but &lt;em&gt;why&lt;/em&gt; I had made them, what problem each one was solving, what I had learned in the process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Studied the project history&lt;/strong&gt; — the previous year's proposals, what had been attempted before, why it hadn't been selected, what the mentors had said they were looking for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prepared to be honest about Ruby on Rails&lt;/strong&gt; — I was still not deeply comfortable with it. Two months of contributing gives you familiarity, but it doesn't make you an expert. I knew which parts I understood well and which parts I had been moving carefully around&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Being honest about uncertainty is better than pretending to know something you don't especially when the people you're talking to know the codebase far better than you do.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All the mentors for my project were present in the interview. I found that out when I joined the call and saw all the names. The opening minutes were nerve-wracking. But once the conversation started, it felt less like an interrogation and more like a genuine discussion — &lt;strong&gt;&lt;em&gt;which is, I think, exactly what a good technical interview is supposed to feel like.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I came out of it thinking I had done reasonably well. I wasn't certain, but I felt like I had represented my actual understanding accurately.&lt;/p&gt;




&lt;h2&gt;
  
  
  There Is a Second Round?
&lt;/h2&gt;

&lt;p&gt;A few days later, I got another message.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;I had cleared the first round. There would be a second interview — five days later.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My initial reaction was not pure excitement. It was something more complicated.&lt;/p&gt;

&lt;p&gt;On one hand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had &lt;strong&gt;cleared the first round&lt;/strong&gt; — the mentors thought the conversation went well enough to continue&lt;/li&gt;
&lt;li&gt;That was genuinely good news&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the other hand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had &lt;strong&gt;assumed there would be one interview&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Finding out there was a second one raised the stakes again&lt;/li&gt;
&lt;li&gt;I had let myself feel like the hardest part was behind me — it wasn't&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then there was a very concrete problem: &lt;strong&gt;the day after the second interview, I had my compiler design lab exam.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I want to describe this dilemma accurately because I think it's the kind of thing that doesn't get talked about enough when people write about GSoC. The romanticised version of applying is that you pour everything into it and everything else makes way. &lt;strong&gt;&lt;em&gt;The real version is that everything else doesn't make way at all.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;College keeps happening:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Exams keep being scheduled&lt;/li&gt;
&lt;li&gt;Assignments keep being due&lt;/li&gt;
&lt;li&gt;Real consequences for your grade don't pause for GSoC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I spent a while genuinely unsure what to do. I couldn't do both properly. Something had to give.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I chose the interview.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I decided it was better to go into the interview focused than to spend the day before it with my attention split between two things. I crammed for the exam after the call. I don't know whether that was the optimal decision in terms of the exam result. But it was the decision I made, and I stand by it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Second Interview
&lt;/h2&gt;

&lt;p&gt;I prepared for the second interview much as I had for the first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Went back over my contributions&lt;/li&gt;
&lt;li&gt;Reviewed the proposal thoroughly&lt;/li&gt;
&lt;li&gt;Made sure I understood the technical details clearly enough to explain them under pressure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The conversation itself went well. What I'll say is that by the time it ended, I had a sense — &lt;em&gt;not certainty, but a sense&lt;/em&gt; — that it had gone the way it needed to go. I had said what I thought, explained my approach clearly, and been honest about the boundaries of what I knew.&lt;/p&gt;

&lt;p&gt;And then I waited again.&lt;/p&gt;




&lt;h2&gt;
  
  
  April 30th
&lt;/h2&gt;

&lt;p&gt;I had been watching the clock on April 30th for most of the evening — not because I was actively anxious, but because I &lt;em&gt;wanted to see it&lt;/em&gt;. The official thing. The acceptance letter in the profile. The Google stamp on it.&lt;/p&gt;

&lt;p&gt;By the time 11:30 PM arrived, I was in bed, phone in hand, scrolling through Netflix trying to find something to watch. A completely ordinary end to an ordinary evening. I opened my GSoC profile, and there it was.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I cannot sleep when I am that happy.&lt;/strong&gt; That is just a thing I have learned about myself.&lt;/p&gt;

&lt;p&gt;I lay there for what felt like hours with my brain going at full speed — not anxious anymore, just overwhelmed in the best possible sense. I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Texted people I probably shouldn't have texted at that hour&lt;/li&gt;
&lt;li&gt;Sent voice notes&lt;/li&gt;
&lt;li&gt;Called someone&lt;/li&gt;
&lt;li&gt;Told everyone who was close to me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next morning I wrote a long email to all my mentors. I thanked them properly, not just a quick reply for selecting me and for the conversations during the interview process, and I asked about the next steps. Writing that email felt important to do well. It was the beginning of a professional working relationship that was going to last at least three months, and &lt;strong&gt;&lt;em&gt;I wanted to start it on the right note.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part Nobody Tells You About
&lt;/h2&gt;

&lt;p&gt;There is something that happens after you get selected for GSoC that I don't think people talk about enough.&lt;/p&gt;

&lt;p&gt;There is a brief period maybe a day or two where the excitement is so overwhelming that you feel like you could do anything. You are riding an enormous wave of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Relief&lt;/strong&gt; — months of uncertainty finally resolved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Happiness&lt;/strong&gt; — the kind that makes you text people at midnight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Satisfaction&lt;/strong&gt; — of having worked hard for something and actually gotten it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then, slowly, the reality of what you've committed to starts to come into focus.&lt;/p&gt;

&lt;p&gt;You have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Twelve weeks&lt;/strong&gt; of a coding period&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A specific project&lt;/strong&gt; with real deliverables&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mentors&lt;/strong&gt; who are experienced, thoughtful people paying attention to your progress&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A proposal&lt;/strong&gt; with your name on it, full of specific claims about what you will accomplish and when&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For me, that moment of reality arriving wasn't frightening — but it was &lt;em&gt;sobering in a healthy way&lt;/em&gt;. It reminded me that &lt;strong&gt;getting selected is the beginning of the work, not the end of it.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The weeks of contributing in February and March, the early mornings, the proposal drafts — those were the audition. &lt;strong&gt;&lt;em&gt;The coding period is the actual performance.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I found that realisation motivating rather than deflating, which I think is probably a good sign.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Believe About This Process
&lt;/h2&gt;

&lt;p&gt;Looking back at everything — the two months of contributing, the early alarms, the proposal drafts, the two interview rounds, the waiting I want to say something honest about what the GSoC application process actually is.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It is not:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A competition for the most brilliant developers at the most prestigious universities&lt;/li&gt;
&lt;li&gt;Something that requires a perfect academic record&lt;/li&gt;
&lt;li&gt;Something that requires years of professional experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What it actually requires:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Requirement&lt;/th&gt;
&lt;th&gt;What it looks like in practice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Genuine interest in open source&lt;/td&gt;
&lt;td&gt;Showing up even when no one is making you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistent effort&lt;/td&gt;
&lt;td&gt;Contributing every day, even for something small&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clear communication&lt;/td&gt;
&lt;td&gt;Asking questions, responding to feedback, being honest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Technical curiosity&lt;/td&gt;
&lt;td&gt;Reading code you didn't write, understanding systems you didn't build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I was a sixth semester engineering student who had &lt;strong&gt;never written a line of Ruby before February&lt;/strong&gt; of this year. I had no prior experience with the CircuitVerse codebase. I was balancing a full college schedule, internal exams, and assignments throughout the application period. &lt;strong&gt;&lt;em&gt;None of that disqualified me.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The process also teaches you things that are genuinely valuable regardless of whether you get selected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reading a real production codebase&lt;/strong&gt; is a skill you can only build by doing it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Writing a defensible technical proposal&lt;/strong&gt; requires a kind of thinking most coursework never asks for&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Building credibility through consistent small actions&lt;/strong&gt; is a professional skill that transfers directly to the working world&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are reading this as someone considering whether to apply next year and aren't sure whether you're ready: &lt;strong&gt;you probably are.&lt;/strong&gt; Start contributing now, before the application period opens. The earlier you start, the more comfortable you will be, and the stronger your proposal will be.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The worst possible outcome is that you spend several months learning more than you expected and become a meaningful contributor to a real open source project. &lt;em&gt;That is a genuinely good outcome.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;The best outcome is an email that keeps you up all night too happy to sleep.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next up: the community bonding period, meeting my mentors properly for the first time, and what the next twelve weeks actually look like.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>career</category>
      <category>devjournal</category>
      <category>google</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Pre GSoC — Finding My Way to CircuitVerse</title>
      <dc:creator>Akanksha Trehun</dc:creator>
      <pubDate>Wed, 06 May 2026 18:51:19 +0000</pubDate>
      <link>https://dev.to/magic-peach/pre-gsoc-finding-my-way-to-circuitverse-5045</link>
      <guid>https://dev.to/magic-peach/pre-gsoc-finding-my-way-to-circuitverse-5045</guid>
      <description>&lt;p&gt;This post is going to be a long one. I figured if I'm going to write about the two months that led up to my GSoC selection, I should do it properly the whole thing, from the very beginning, not just the highlights. So grab a coffee, get comfortable, and let's go back to where this story actually starts.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Classroom Demo I Never Forgot
&lt;/h2&gt;

&lt;p&gt;The first time I heard the name &lt;strong&gt;CircuitVerse&lt;/strong&gt;, I was sitting in a &lt;em&gt;Digital Principles of Design&lt;/em&gt; class in my third semester. I'm currently in my sixth semester, so that's about a year and a half ago now. It wasn't a big moment. It wasn't even really part of the class.&lt;/p&gt;

&lt;p&gt;Our faculty and I'm genuinely grateful to her for this had pulled up CircuitVerse on the projector one day just to show us something. It wasn't in the syllabus. It wasn't going to be on the exam. She just wanted us to see what it actually looked like when the circuits we were drawing on paper came to life on a screen. We were studying:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Half adders and full adders&lt;/li&gt;
&lt;li&gt;JK flip flops&lt;/li&gt;
&lt;li&gt;Foundational digital logic that you spend your first years drawing on paper or building with actual wires on a breadboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;She simulated a few circuits in front of us, walked us through how the inputs and outputs worked, showed us how you could change values and watch the circuit respond in real time. It was maybe twenty minutes of a single class period. And then we moved on.&lt;/p&gt;

&lt;p&gt;But I remember thinking even then, as a third semester student still getting used to the pace of engineering college that this was a &lt;em&gt;really&lt;/em&gt; interesting platform. There was something satisfying about seeing the logic work visually, in real time, without needing physical components. I didn't do anything with that thought at the time. I just filed it away somewhere.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That's where it started. One classroom demo that I technically didn't need to pay close attention to.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why This Year
&lt;/h2&gt;

&lt;p&gt;Fast forward to the beginning of this year. I'm in my sixth semester, roughly halfway through my degree, and I had been thinking about GSoC for a while not in a serious, planned out way, but in the background. I knew what it was. I knew it was something I wanted to try. I just hadn't pulled the trigger.&lt;/p&gt;

&lt;p&gt;This year felt different. I had a feeling and I think a lot of students who've gone through this will understand it that &lt;strong&gt;if I kept waiting for the perfect time, the perfect time was never going to arrive.&lt;/strong&gt; There is always:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An exam&lt;/li&gt;
&lt;li&gt;A project due&lt;/li&gt;
&lt;li&gt;Some reasonable-sounding reason to push it to next semester&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And at some point, next semester becomes next year, and next year becomes too late.&lt;/p&gt;

&lt;p&gt;I'm in sixth semester. If I didn't apply this year, I'd have my seventh and then my final eighth semester, and by then everything gets consumed by placements and final year projects. &lt;strong&gt;&lt;em&gt;The window felt like right now, not later.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So when the 2026 GSoC organisations were announced and I saw CircuitVerse on the list, something clicked immediately. I already had that memory of it from third sem. I'd always had a genuine interest in circuits and digital logic it goes back further than that DPD class, actually, all the way to eleventh and twelfth grade in school, where I first encountered electronics properly. It was one of those subjects that made sense to me intuitively in a way that not everything does.&lt;/p&gt;

&lt;p&gt;And I thought: &lt;em&gt;I know what this platform is, I care about what it does, and I can try.&lt;/em&gt; So I did.&lt;/p&gt;




&lt;h2&gt;
  
  
  Starting From Zero
&lt;/h2&gt;

&lt;p&gt;I want to be honest about where I was when I started contributing to CircuitVerse in February. I was &lt;strong&gt;not&lt;/strong&gt; a well-prepared, experienced open source developer who had been waiting for the right organisation. I had contributed to a few other open source programmes before, so I wasn't completely new to pull requests, issues, and code review. But CircuitVerse specifically? I was starting from scratch.&lt;/p&gt;

&lt;p&gt;And the first thing I ran into was the codebase itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CircuitVerse runs on Ruby on Rails.&lt;/strong&gt; For those unfamiliar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Ruby on Rails&lt;/em&gt; is a web application framework built on the Ruby programming language&lt;/li&gt;
&lt;li&gt;It has its own conventions, its own file structure, its own way of thinking about problems&lt;/li&gt;
&lt;li&gt;It is absolutely &lt;strong&gt;not&lt;/strong&gt; part of the curriculum at my college&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had never written a line of Ruby before February. I had never built anything in Rails. Both the language and the framework were entirely new to me.&lt;/p&gt;

&lt;p&gt;The codebase is also large. This is not a small hobby project — CircuitVerse is a platform used by students and educators all over the world, and the code reflects years of development from many different contributors.&lt;/p&gt;

&lt;p&gt;The first time I cloned the repository and opened it, I felt &lt;em&gt;genuinely lost&lt;/em&gt;. Not discouraged — but lost.&lt;/p&gt;

&lt;p&gt;So I did what you do when you're lost. I started from the very beginning:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Watched Ruby on Rails tutorials and beginner walkthroughs on YouTube&lt;/li&gt;
&lt;li&gt;Read the official Rails documentation&lt;/li&gt;
&lt;li&gt;Read the CircuitVerse contribution guides and developer documentation&lt;/li&gt;
&lt;li&gt;Spent time building a mental map of how the whole thing fit together before I tried to change any of it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Did I fully understand it after a week? No. But I understood enough to start, and that's all you actually need.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Rule I Set For Myself
&lt;/h2&gt;

&lt;p&gt;From February onward, &lt;strong&gt;consistency became my only rule.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It might sound simple, but it is genuinely harder than it sounds. When you are trying to break into a large open source project as an outsider, the temptation is to wait until you feel ready...until you understand enough to make something meaningful. But that moment of feeling ready never comes on its own. There is no threshold you cross where the codebase suddenly makes sense. You only get there by actually working in it, making mistakes, getting feedback, and going again.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The journey of a thousand miles begins with a single step"&lt;/em&gt; — and in open source, that first step is almost always smaller and more unglamorous than you expect.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I started small:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Documentation fixes&lt;/strong&gt; — correcting things that were incomplete or inaccurate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Updating tests&lt;/strong&gt; — fixing outdated test cases that no longer reflected the current code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small bug fixes&lt;/strong&gt; — low-risk contributions that didn't require deep knowledge of the whole system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not glamorous work, but &lt;em&gt;important&lt;/em&gt; work, the kind of work that keeps a codebase healthy and maintainable. More importantly, it got me reading the code every single day, building familiarity one small piece at a time.&lt;/p&gt;

&lt;p&gt;I worked hard at it not in the sense of grinding through long sleepless nights, but in the quieter and more demanding sense of &lt;strong&gt;showing up without exception&lt;/strong&gt;. Even on the days when I was tired. Even when the progress felt invisible. Even when I wasn't sure what I was doing was making any difference.&lt;/p&gt;

&lt;p&gt;Some days I made several contributions. Some days I barely scraped through with one small fix. But the consistency mattered far more than the volume on any given day. Showing up every day, even for something modest, built a habit. &lt;strong&gt;&lt;em&gt;And habits compound in ways that occasional bursts of effort simply do not.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Over the weeks, I started to feel the codebase becoming familiar. I began recognising file names, understanding what different directories were responsible for, knowing where to look when I encountered something I didn't understand. The codebase had not changed. I had just spent enough time in it that it stopped feeling foreign — and that shift, slow and quiet as it was, turned out to be everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Saturday Meetings
&lt;/h2&gt;

&lt;p&gt;CircuitVerse has &lt;strong&gt;weekly community meetings every Saturday&lt;/strong&gt;, and I made it a rule to attend as many of them as I could. The only real exceptions were when I had an exam on Monday, and even then I'd try to go over what had been discussed afterwards.&lt;/p&gt;

&lt;p&gt;I want to say clearly: &lt;em&gt;these meetings were more valuable than I expected when I first started attending.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When you're a new contributor reading a codebase alone, you get a limited picture of the project. You see the code, but you don't necessarily understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The priorities and ongoing discussions&lt;/li&gt;
&lt;li&gt;What the maintainers are excited about&lt;/li&gt;
&lt;li&gt;What's been tried and abandoned&lt;/li&gt;
&lt;li&gt;What's coming next&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The meetings gave me that layer of context that you simply can't get from reading files alone. They also gave me a sense of how the community operated how decisions got made, how contributors communicated, how to bring up a question without sounding like you hadn't done your homework. These things aren't written in any documentation. &lt;strong&gt;&lt;em&gt;They're things you absorb from being present over time.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gradually, I started feeling less like an outsider submitting pull requests into the void and more like someone who actually belonged in the community, at least in a small way. That shift matters more than it might seem.&lt;/p&gt;




&lt;h2&gt;
  
  
  Growing Into Bigger Contributions
&lt;/h2&gt;

&lt;p&gt;As February turned into March, I started feeling more confident. The codebase was familiar enough that I could look for more substantial issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Actual bugs&lt;/strong&gt; that needed fixing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Missing features&lt;/strong&gt; that were clearly needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Things that needed real work&lt;/strong&gt; rather than just documentation updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I started creating my own issues rather than only picking up ones that were already listed. I also reached out to the mentors for the specific project I was interested in. This felt more nerve wracking than it probably should have... there's an intimidation factor around directly contacting experienced maintainers when you're a new contributor.&lt;/p&gt;

&lt;p&gt;But I sent the messages, asked the questions, and &lt;strong&gt;the mentors were approachable.&lt;/strong&gt; They replied, pointed me toward relevant parts of the codebase, gave feedback on my pull requests. I want to acknowledge that, because I think the attitude of a project's maintainers has a &lt;em&gt;huge&lt;/em&gt; influence on whether new contributors stick around or quietly disappear.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Feeling like your questions are welcome makes an enormous difference when you're just starting out.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Deciding It Was Time to Write
&lt;/h2&gt;

&lt;p&gt;At some point in early March I made a call: &lt;em&gt;I have enough now. It's time to start writing the proposal.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I want to be clear about what "enough" meant. It &lt;strong&gt;didn't&lt;/strong&gt; mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had mastered the codebase&lt;/li&gt;
&lt;li&gt;I had become an indispensable contributor&lt;/li&gt;
&lt;li&gt;I felt completely ready&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It &lt;strong&gt;did&lt;/strong&gt; mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I had enough familiarity with the project&lt;/li&gt;
&lt;li&gt;I had enough presence in the community&lt;/li&gt;
&lt;li&gt;I understood what needed to be built well enough to write something credible&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before I wrote anything of my own, I spent time reading. The project I was applying for had been proposed the previous year and hadn't been selected I don't know exactly why, but it meant there was history to learn from. I read:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proposals from people who had worked on CircuitVerse in previous GSoC cycles&lt;/li&gt;
&lt;li&gt;Older ideas pages and discussions&lt;/li&gt;
&lt;li&gt;Notes about what had been built and what was still outstanding&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That research took days. But it was the most important preparation I did, because it meant that when I started writing, I wasn't guessing at what the organisation wanted. &lt;strong&gt;&lt;em&gt;I had evidence.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Seven Drafts, Maybe Ten
&lt;/h2&gt;

&lt;p&gt;I wrote somewhere between &lt;strong&gt;seven and ten drafts&lt;/strong&gt; of my proposal. I lost count after a while.&lt;/p&gt;

&lt;p&gt;I kept going back to it. The cycle looked something like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write a section&lt;/li&gt;
&lt;li&gt;Read it the next morning&lt;/li&gt;
&lt;li&gt;Decide it wasn't clear enough&lt;/li&gt;
&lt;li&gt;Rewrite it entirely&lt;/li&gt;
&lt;li&gt;Add diagrams → delete diagrams → add them back in a cleaner form&lt;/li&gt;
&lt;li&gt;Restructure the timeline&lt;/li&gt;
&lt;li&gt;Rewrite the problem statement&lt;/li&gt;
&lt;li&gt;Change the order of sections → change it back&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The hardest section, without question, was the timeline.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In college, someone gives you a deadline and you work toward it. You're not usually asked to commit, in writing, to what you will accomplish in each specific week of the next three months. GSoC asks you to do exactly that — to look at twelve weeks and say with real specificity what will be done by the end of week one, two, three, all the way through.&lt;/p&gt;

&lt;p&gt;In my case, there was an additional layer of complexity — I had to account for my college schedule, which I can't fully predict:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Internal exam dates aren't announced at the beginning of the semester&lt;/li&gt;
&lt;li&gt;Assignment deadlines shift based on faculty schedules&lt;/li&gt;
&lt;li&gt;Lab work takes unpredictable amounts of time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had to build buffer into my timeline without making it look like I was padding. &lt;em&gt;I spent more hours on that timeline than on any other part of the proposal.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The second hardest section was the &lt;strong&gt;problem and solution&lt;/strong&gt; where you show that you actually understand what you're proposing to build, not at a surface level, but in real technical depth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Five Forty-Five AM
&lt;/h2&gt;

&lt;p&gt;All of this was happening while I was attending college, sitting internal exams, completing assignments, and trying to maintain some kind of normal student life.&lt;/p&gt;

&lt;p&gt;The time I found was in the mornings.&lt;/p&gt;

&lt;p&gt;I started setting my alarm for &lt;strong&gt;5:45 AM&lt;/strong&gt; and trying to be up by six. That gave me an hour to an hour and a half before I had to think about anything else before college, before messages, before the day's demands started stacking up.&lt;/p&gt;

&lt;p&gt;It doesn't sound like much. But when that's the only truly quiet time available in a given day, you make the most of it. And over six or seven weeks, those morning sessions added up to something real.&lt;/p&gt;

&lt;p&gt;There were mornings when the alarm went off and getting out of bed took everything I had. Days when I sat at my desk with coffee going cold and the proposal open and nothing useful in my head. But I showed up anyway, did what I could, and went to college. &lt;strong&gt;&lt;em&gt;And slowly the drafts got better.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Submitting
&lt;/h2&gt;

&lt;p&gt;I was late submitting my proposal for mentor review, which meant I didn't get as much feedback as I'd wanted. I got some — one mentor gave me genuinely useful notes that I was able to implement... but I wish I'd started the review process earlier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If there's one piece of advice I'd give to anyone applying next year:&lt;/strong&gt; send your draft to the mentors at least two weeks before the deadline. You need enough time to actually &lt;em&gt;act&lt;/em&gt; on the feedback, not just read it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The final deadline was &lt;strong&gt;March 31st, 11:30 PM IST&lt;/strong&gt;. I submitted at &lt;strong&gt;11:20 PM&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ten minutes to spare. &lt;em&gt;I'm not recommending this approach.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I was proud of what I submitted though. It was specific, honest, reflected months of work, and was genuinely mine in a way that felt important. And then there was nothing left to do but wait.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Process Actually Is
&lt;/h2&gt;

&lt;p&gt;I want to end this post with something I believe is genuinely truemnot just something people say to make those who weren't selected feel better.&lt;/p&gt;

&lt;p&gt;The pre-GSoC period teaches you things that &lt;strong&gt;cannot be learned any other way:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Where you learn it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Reading a real-world codebase&lt;/td&gt;
&lt;td&gt;By actually working in one&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Writing a credible technical proposal&lt;/td&gt;
&lt;td&gt;By writing seven drafts and rewriting them&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consistent community contribution&lt;/td&gt;
&lt;td&gt;By showing up every single day&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Professional communication&lt;/td&gt;
&lt;td&gt;By reaching out to maintainers and getting feedback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;GSoC is &lt;strong&gt;not&lt;/strong&gt; a competition for the most brilliant students at the best universities. It is an opportunity for anyone who is genuinely interested in open source and willing to put in consistent, honest work.&lt;/p&gt;

&lt;p&gt;I was a sixth semester student who had never written Ruby before February. I didn't have a polished portfolio or a list of impressive prior projects. &lt;strong&gt;&lt;em&gt;I just kept showing up every day and tried to get a little better.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're reading this and considering whether to apply next year — start &lt;strong&gt;now&lt;/strong&gt;. Not next month. Now. The earlier you start contributing, the more comfortable you'll be with the codebase by the time the proposal period opens. And even if you don't get selected the first time, the work you do in the process is real and valuable in itself.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;In the next post: what happened after the submission the shortlist, rounds of interviews, and the night I found out I got in.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
