<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://nettek.ca/feed.xml" rel="self" type="application/atom+xml" /><link href="https://nettek.ca/" rel="alternate" type="text/html" /><updated>2025-10-22T14:36:51+00:00</updated><id>https://nettek.ca/feed.xml</id><title type="html">Jocelyn Stericker</title><subtitle>Software engineer who likes running a lot. Kitchener, ON.</subtitle><entry><title type="html">Let’s build a voice journal in Rust | Ep. 5: Electron + napi-rs 2</title><link href="https://nettek.ca/2022/01/17/oxygen-ep5.html" rel="alternate" type="text/html" title="Let’s build a voice journal in Rust | Ep. 5: Electron + napi-rs 2" /><published>2022-01-17T00:01:15+00:00</published><updated>2022-01-17T00:01:15+00:00</updated><id>https://nettek.ca/2022/01/17/oxygen-ep5</id><content type="html" xml:base="https://nettek.ca/2022/01/17/oxygen-ep5.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/qqTDieMvN1s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>In this episode, we’re taking our voice journal CLI written in Rust and adding a UI for it. This episode covers many topics very quickly: napi-rs, Electron, Parcel (which uses swc, a JS compiler written in Rust!), React, and Tailwind.</p>

<p>In this series, we’re building Oxygen, a voice journal and audio analysis toolkit for people who want to change the way their voice comes across. In the next few episodes, we’re going to be improving the UI and setting up GitHub Actions to build Oyxgen for Mac, Windows, and Linux. This involves generally making the build/linting setup less ad hoc. Later on, we’ll be adding voice analysis to Oxygen, which is really the whole point.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Let’s build a voice journal in Rust | Ep. 4: audio exports, std::path</title><link href="https://nettek.ca/2022/01/10/oxygen-ep4.html" rel="alternate" type="text/html" title="Let’s build a voice journal in Rust | Ep. 4: audio exports, std::path" /><published>2022-01-10T00:01:15+00:00</published><updated>2022-01-10T00:01:15+00:00</updated><id>https://nettek.ca/2022/01/10/oxygen-ep4</id><content type="html" xml:base="https://nettek.ca/2022/01/10/oxygen-ep4.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/aqo57r5Mkk0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>Today, we’re adding subcommands to export audio clips.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Let’s build a voice journal in Rust | Ep. 3: audio imports</title><link href="https://nettek.ca/2022/01/04/oxygen-ep3.html" rel="alternate" type="text/html" title="Let’s build a voice journal in Rust | Ep. 3: audio imports" /><published>2022-01-04T00:01:15+00:00</published><updated>2022-01-04T00:01:15+00:00</updated><id>https://nettek.ca/2022/01/04/oxygen-ep3</id><content type="html" xml:base="https://nettek.ca/2022/01/04/oxygen-ep3.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/FCHaCt6ELq8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>Today, we’re adding a subcommand to import existing audio clips.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Let’s build a voice journal in Rust | Ep. 2: opus encoding, db migration</title><link href="https://nettek.ca/2022/01/03/oxygen-ep2.html" rel="alternate" type="text/html" title="Let’s build a voice journal in Rust | Ep. 2: opus encoding, db migration" /><published>2022-01-03T00:01:15+00:00</published><updated>2022-01-03T00:01:15+00:00</updated><id>https://nettek.ca/2022/01/03/oxygen-ep2</id><content type="html" xml:base="https://nettek.ca/2022/01/03/oxygen-ep2.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/pray6yuCz7k" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>Today, we’re taking a brief look at the audio encoding/decoding landscape in Rust and replacing our naive audio encoding with opus.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Let’s build a voice journal in Rust | Ep. 1: audio I/O, SQlite, CLI args</title><link href="https://nettek.ca/2021/12/31/oxygen-ep1.html" rel="alternate" type="text/html" title="Let’s build a voice journal in Rust | Ep. 1: audio I/O, SQlite, CLI args" /><published>2021-12-31T00:01:15+00:00</published><updated>2021-12-31T00:01:15+00:00</updated><id>https://nettek.ca/2021/12/31/oxygen-ep1</id><content type="html" xml:base="https://nettek.ca/2021/12/31/oxygen-ep1.html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/ZweInbMBsa4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

<p>In this series, I’m going to build Oxygen, a voice journal and audio analysis toolkit for people who want to change the way their voice comes across. In the first episode, we’re making a CLI clone of the “Voice Memos” app on Apple platforms — it lets you record and play back audio clips. In the next few videos, I’ll talk about audio compression/encoding/decoding and make our CLI app a little more fully featured. Later on, I will also be building a UI and diving into audio processing and analysis.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Figma SVG to React SVG</title><link href="https://nettek.ca/2019/05/19/figma-to-react.html" rel="alternate" type="text/html" title="Figma SVG to React SVG" /><published>2019-05-19T18:30:00+00:00</published><updated>2019-05-19T18:30:00+00:00</updated><id>https://nettek.ca/2019/05/19/figma-to-react</id><content type="html" xml:base="https://nettek.ca/2019/05/19/figma-to-react.html"><![CDATA[<p>In Figma, you can select anything and copy it as SVG using a context menu option.
It’s great! I used this feature to get started the interactive illustrations
on the Khan Academy <a href="https://www.khanacademy.org/?country=US" target="_blank">homepage</a>
(currently US-only, unless you use that link).</p>

<p>Sadly, the output isn’t JSX, and it embeds images &amp; paths, which adds a lot of
busy work before you can actually start adding interactivity.</p>

<p>I made a tool to turn the output from Figma into JSX, while splitting out the
images and paths. It’s a simple tool, but it’s already saved me hours.</p>

<p>If this sounds like something that would be useful to you, <a href="https://nettek.ca/figma-svg-to-react-svg/">check it out</a>.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[In Figma, you can select anything and copy it as SVG using a context menu option. It’s great! I used this feature to get started the interactive illustrations on the Khan Academy homepage (currently US-only, unless you use that link).]]></summary></entry><entry><title type="html">Another game about climbing a mountain!</title><link href="https://nettek.ca/2018/03/20/climbing-a-mountain.html" rel="alternate" type="text/html" title="Another game about climbing a mountain!" /><published>2018-03-20T18:30:00+00:00</published><updated>2018-03-20T18:30:00+00:00</updated><id>https://nettek.ca/2018/03/20/climbing-a-mountain</id><content type="html" xml:base="https://nettek.ca/2018/03/20/climbing-a-mountain.html"><![CDATA[<p>My
<a href="https://www.khanacademy.org/coach/class/__demo__/program/BrainTraining2018" target="_blank">most recent project</a> (sign-in required) at
Khan Academy was a fun program for teachers
designed to motivate and engage their students. It takes advantage of
peer pressure — the more assignments a class completes, the more progress
they’ll have to celebrate on the Brain Training progress tracker.
The design was by <a href="http://jacobgreif.com" target="_blank">Jacob
Greif</a> and I coded it.</p>

<p>During this project, I had a chance to use Apollo GraphQL for the first time
and am a fan. The project is designed to be reskinable and customizable so that
we can launch other similar programs around the year, and customize them for
different countries and locales.</p>

<video controls="" src="/BrainTraining.mp4" width="740"></video>
<p><br /></p>

<p>It’s nice to work on a project that gets this kind of reaction (make sure to
turn sound on!):</p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">3rd graders in Mrs.Locovare room are starting off strong 💪😜as the competition begins <a href="https://twitter.com/hashtag/BrainTraining?src=hash&amp;ref_src=twsrc%5Etfw">#BrainTraining</a> <a href="https://twitter.com/khanacademy?ref_src=twsrc%5Etfw">@khanacademy</a> <a href="https://twitter.com/Willow_Dale_ES?ref_src=twsrc%5Etfw">@Willow_Dale_ES</a> <a href="https://twitter.com/CSDKhanAcademy?ref_src=twsrc%5Etfw">@CSDKhanAcademy</a> <a href="https://twitter.com/MathwithJoshG?ref_src=twsrc%5Etfw">@MathwithJoshG</a> <a href="https://t.co/igBQipZA0I">pic.twitter.com/igBQipZA0I</a></p>&mdash; Conor Corey (@ccorey223) <a href="https://twitter.com/ccorey223/status/975827600709967872?ref_src=twsrc%5Etfw">March 19, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p><br /></p>

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">Practice makes progress! <a href="https://twitter.com/hashtag/KhanBrainTraining?src=hash&amp;ref_src=twsrc%5Etfw">#KhanBrainTraining</a> <a href="https://twitter.com/hashtag/cbrsd?src=hash&amp;ref_src=twsrc%5Etfw">#cbrsd</a> With a little bit of preparation to personalize student <a href="https://twitter.com/khanacademy?ref_src=twsrc%5Etfw">@khanacademy</a> assignments, teamwork, &amp; expert learners; what else would come of forty minutes of sheer brain power, but HUGE growth &amp; celebrations! I&#39;m on cloud nine! <a href="https://twitter.com/hashtag/udl?src=hash&amp;ref_src=twsrc%5Etfw">#udl</a> <a href="https://t.co/mvJlXvoRO0">pic.twitter.com/mvJlXvoRO0</a></p>&mdash; Jennifer Cimini M.Ed (@jenny_cimini) <a href="https://twitter.com/jenny_cimini/status/976091054406553600?ref_src=twsrc%5Etfw">March 20, 2018</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>And this is why I love my job.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[My most recent project (sign-in required) at Khan Academy was a fun program for teachers designed to motivate and engage their students. It takes advantage of peer pressure — the more assignments a class completes, the more progress they’ll have to celebrate on the Brain Training progress tracker. The design was by Jacob Greif and I coded it.]]></summary></entry><entry><title type="html">Introducing Hacklily!</title><link href="https://nettek.ca/2018/03/11/introducing-hacklily.html" rel="alternate" type="text/html" title="Introducing Hacklily!" /><published>2018-03-11T15:29:15+00:00</published><updated>2018-03-11T15:29:15+00:00</updated><id>https://nettek.ca/2018/03/11/introducing-hacklily</id><content type="html" xml:base="https://nettek.ca/2018/03/11/introducing-hacklily.html"><![CDATA[<p>I’ve been working on an online LilyPond editor in my spare time, and
would appreciate your feedback. You can use it as a scratchpad, or sign
in with a GitHub account to save sheet music directly there.</p>

<p>Try it at <a href="https://www.hacklily.org">hacklily.org</a>!</p>

<p>It’s inspired by great projects like LilyBin and Overleaf.</p>

<p>You can give me feedback by replying to me, or on <a href="https://github.com/hacklily/hacklily">GitHub</a>.</p>

<p>I hope you find it useful and am looking forward to your feedback.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[I’ve been working on an online LilyPond editor in my spare time, and would appreciate your feedback. You can use it as a scratchpad, or sign in with a GitHub account to save sheet music directly there.]]></summary></entry><entry><title type="html">Hello World!</title><link href="https://nettek.ca/2018/03/11/hello-world.html" rel="alternate" type="text/html" title="Hello World!" /><published>2018-03-11T14:48:15+00:00</published><updated>2018-03-11T14:48:15+00:00</updated><id>https://nettek.ca/2018/03/11/hello-world</id><content type="html" xml:base="https://nettek.ca/2018/03/11/hello-world.html"><![CDATA[<p>For those who don’t know me, I am a software engineer working remotely for Khan Academy. In my spare
time I play piano, compose, code, bike, climb, and play board games. I live in Waterloo, Canada.</p>

<p>I will — on rare occasions — post about those things.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[For those who don’t know me, I am a software engineer working remotely for Khan Academy. In my spare time I play piano, compose, code, bike, climb, and play board games. I live in Waterloo, Canada.]]></summary></entry></feed>