PageSourceSearch

https://brianyu.me/software

html brianyu.me collected 2026-10-03 20:17:16 UTC 18,228 bytes, 17 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" href="/projects/presenter.png"/><link rel="preload" as="image" href="/projects/littleuseful.png"/><link rel="preload" as="image" href="/projects/classroometrics.png"/><link rel="preload" as="image" href="/projects/tenacity.png"/><link rel="preload" as="image" href="/projects/jeopardy.png"/><link rel="preload" as="image" href="/projects/multicolor.png"/><link rel="preload" as="image" href="/projects/momentary.png"/><link rel="stylesheet" href="/assets/styles-CShp7uWu.css" data-precedence="default"/><link rel="stylesheet" href="/assets/index-5XhEK94Y.css" data-precedence="default"/><link rel="stylesheet" href="/assets/software-DuauDN6J.css" data-precedence="default"/>
1<script async="" src="https://apis.google.com/js/platform.js"></script>
vendor: 66 bytes, line 1
1<script async="" src="https://www.googletagmanager.com/gtag/js?id=
1G-Z22ZVTTNM4
vendor: 11 bytes, line 1
1"></script>
1<title>Software - Brian Yu</title><meta name="description" content="Brian Yu is an educator and software developer"/><link rel="modulepreload" href="/assets/index-CY5gizDU.js"/><link rel="modulepreload" href="/assets/software-BWp3RIZ9.js"/><link rel="icon" type="image/png" sizes="192x192" href="/favicons/android-chrome-192x192.png"/><link rel="icon" type="image/png" sizes="512x512" href="/favicons/android-chrome-512x512.png"/><link rel="apple-touch-icon" sizes="180x180" href="/favicons/apple-touch-icon.png"/><link rel="manifest" href="/site.webmanifest"/><link rel="shortcut icon" href="/favicon.ico"/>
1<script data-mantine-script="true">try {
2  var _colorScheme = window.localStorage.getItem("mantine-color-scheme-value");
3  var colorScheme = _colorScheme === "light" || _colorScheme === "dark" || _colorScheme === "auto" ? _colorScheme : "auto";
4  var computedColorScheme = colorScheme !== "auto" ? colorScheme : window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
5  document.documentElement.setAttribute("data-mantine-color-scheme", computedColorScheme);
6} catch (e) {}
7</script>
7<script>
8              window.dataLayer = window.dataLayer || [];
9              function gtag(){window.dataLayer.push(arguments);}
10              gtag('js', new Date());
11              gtag('config', 'G-Z22ZVTTNM4', { send_page_view: false });
12            </script>
12</head><body><style data-mantine-styles="true">:root, :host{--mantine-font-family: "Open Sans", Arial, sans-serif;--mantine-font-family-headings: "Open Sans", Arial, sans-serif;--mantine-radius-default: calc(0.25rem * var(--mantine-scale));--mantine-primary-color-filled: var(--mantine-color-brand-filled);--mantine-primary-color-filled-hover: var(--mantine-color-brand-filled-hover);--mantine-primary-color-light: var(--mantine-color-brand-light);--mantine-primary-color-light-hover: var(--mantine-color-brand-light-hover);--mantine-primary-color-light-color: var(--mantine-color-brand-light-color);--mantine-primary-color-0: var(--mantine-color-brand-0);--mantine-primary-color-1: var(--mantine-color-brand-1);--mantine-primary-color-2: var(--mantine-color-brand-2);--mantine-primary-color-3: var(--mantine-color-brand-3);--mantine-primary-color-4: var(--mantine-color-brand-4);--mantine-primary-color-5: var(--mantine-color-brand-5);--mantine-primary-color-6: var(--mantine-color-brand-6);--mantine-primary-color-7: var(--mantine-color-brand-7);--mantine-primary-color-8: var(--mantine-color-brand-8);--mantine-primary-color-9: var(--mantine-color-brand-9);--mantine-color-brand-0: #e8fbff;--mantine-color-brand-1: #cff5ff;--mantine-color-brand-2: #9ee8fb;--mantine-color-brand-3: #67d6f0;--mantine-color-brand-4: #2dd4bf;--mantine-color-brand-5: #1f9fc8;--mantine-color-brand-6: #155e75;--mantine-color-brand-7: #0f3f50;--mantine-color-brand-8: #0b2f3d;--mantine-color-brand-9: #081f2a;}
13
14:root[data-mantine-color-scheme="dark"], :host([data-mantine-color-scheme="dark"]){--mantine-primary-color-contrast: #081112;--mantine-color-text: #f4f7f8;--mantine-color-body: #101214;--mantine-color-anchor: var(--mantine-color-brand-4);--mantine-color-dark-filled: var(--mantine-color-dark-4);--mantine-color-dark-filled-hover: var(--mantine-color-dark-5);--mantine-color-dark-outline: var(--mantine-color-dark-0);--mantine-color-dark-outline-hover: rgba(201, 201, 201, 0.05);--mantine-color-gray-filled: var(--mantine-color-gray-4);--mantine-color-gray-filled-hover: var(--mantine-color-gray-5);--mantine-color-gray-outline: var(--mantine-color-gray-0);--mantine-color-gray-outline-hover: rgba(248, 249, 250, 0.05);--mantine-color-red-filled: var(--mantine-color-red-4);--mantine-color-red-filled-hover: var(--mantine-color-red-5);--mantine-color-red-outline: var(--mantine-color-red-0);--mantine-color-red-outline-hover: rgba(255, 245, 245, 0.05);--mantine-color-pink-filled: var(--mantine-color-pink-4);--mantine-color-pink-filled-hover: var(--mantine-color-pink-5);--mantine-color-pink-outline: var(--mantine-color-pink-0);--mantine-color-pink-outline-hover: rgba(255, 240, 246, 0.05);--mantine-color-grape-filled: var(--mantine-color-grape-4);--mantine-color-grape-filled-hover: var(--mantine-color-grape-5);--mantine-color-grape-outline: var(--mantine-color-grape-0);--mantine-color-grape-outline-hover: rgba(248, 240, 252, 0.05);--mantine-color-violet-filled: var(--mantine-color-violet-4);--mantine-color-violet-filled-hover: var(--mantine-color-violet-5);--mantine-color-violet-outline: var(--mantine-color-violet-0);--mantine-color-violet-outline-hover: rgba(243, 240, 255, 0.05);--mantine-color-indigo-filled: var(--mantine-color-indigo-4);--mantine-color-indigo-filled-hover: var(--mantine-color-indigo-5);--mantine-color-indigo-outline: var(--mantine-color-indigo-0);--mantine-color-indigo-outline-hover: rgba(237, 242, 255, 0.05);--mantine-color-blue-filled: var(--mantine-color-blue-4);--mantine-color-blue-filled-hover: var(--mantine-color-blue-5);--mantine-color-blue-outline: var(--mantine-color-blue-0);--mantine-color-blue-outline-hover: rgba(231, 245, 255, 0.05);--mantine-color-cyan-filled: var(--mantine-color-cyan-4);--mantine-color-cyan-filled-hover: var(--mantine-color-cyan-5);--mantine-color-cyan-outline: var(--mantine-color-cyan-0);--mantine-color-cyan-outline-hover: rgba(227, 250, 252, 0.05);--mantine-color-teal-filled: var(--mantine-color-teal-4);--mantine-color-teal-filled-hover: var(--mantine-color-teal-5);--mantine-color-teal-outline: var(--mantine-color-teal-0);--mantine-color-teal-outline-hover: rgba(230, 252, 245, 0.05);--mantine-color-green-filled: var(--mantine-color-green-4);--mantine-color-green-filled-hover: var(--mantine-color-green-5);--mantine-color-green-outline: var(--mantine-color-green-0);--mantine-color-green-outline-hover: rgba(235, 251, 238, 0.05);--mantine-color-lime-filled: var(--mantine-color-lime-4);--mantine-color-lime-filled-hover: var(--mantine-color-lime-5);--mantine-color-lime-outline: var(--mantine-color-lime-0);--mantine-color-lime-outline-hover: rgba(244, 252, 227, 0.05);--mantine-color-yellow-filled: var(--mantine-color-yellow-4);--mantine-color-yellow-filled-hover: var(--mantine-color-yellow-5);--mantine-color-yellow-outline: var(--mantine-color-yellow-0);--mantine-color-yellow-outline-hover: rgba(255, 249, 219, 0.05);--mantine-color-orange-filled: var(--mantine-color-orange-4);--mantine-color-orange-filled-hover: var(--mantine-color-orange-5);--mantine-color-orange-outline: var(--mantine-color-orange-0);--mantine-color-orange-outline-hover: rgba(255, 244, 230, 0.05);--mantine-color-brand-text: var(--mantine-color-brand-4);--mantine-color-brand-filled: var(--mantine-color-brand-4);--mantine-color-brand-filled-hover: var(--mantine-color-brand-5);--mantine-color-brand-light: rgba(4, 16, 21, 1);--mantine-color-brand-light-hover: rgba(6, 22, 29, 1);--mantine-color-brand-light-color: var(--mantine-color-brand-0);--mantine-color-brand-outline: var(--mantine-color-brand-0);--mantine-color-brand-outline-hover: rgba(232, 251, 255, 0.05);--site-color-background: #101214;--site-color-surface: #181c20;--site-color-text-primary: #f4f7f8;--site-color-text-muted: #a8b2bc;--site-color-border: #2b333b;--site-color-link: #99c0cc;--site-color-link-decoration: #3b6474;--site-color-link-hover: #b7e9ff;--site-color-link-hover-decoration: #7dd3fc;--site-color-button-background: #93a9c9;--site-color-button-background-hover: #778cab;--site-color-button-text: #081112;--site-color-focus-ring: #67e8f9;--mantine-primary-color-filled: #93a9c9;--mantine-primary-color-filled-hover: #778cab;}
15
16:root[data-mantine-color-scheme="light"], :host([data-mantine-color-scheme="light"]){--mantine-primary-color-contrast: #ffffff;--mantine-color-text: #141414;--mantine-color-body: #ffffff;--mantine-color-anchor: var(--mantine-color-brand-6);--mantine-color-brand-text: var(--mantine-color-brand-filled);--mantine-color-brand-filled: var(--mantine-color-brand-6);--mantine-color-brand-filled-hover: var(--mantine-color-brand-7);--mantine-color-brand-light: var(--mantine-color-brand-1);--mantine-color-brand-light-hover: var(--mantine-color-brand-2);--mantine-color-brand-light-color: var(--mantine-color-brand-9);--mantine-color-brand-outline: var(--mantine-color-brand-6);--mantine-color-brand-outline-hover: rgba(21, 94, 117, 0.05);--site-color-background: #ffffff;--site-color-surface: #f5f7f8;--site-color-text-primary: #141414;--site-color-text-muted: #5d6670;--site-color-border: #dfe4e8;--site-color-link: #1b5364;--site-color-link-decoration: #a9c8d3;--site-color-link-hover: #0f3f50;--site-color-link-hover-decoration: #155e75;--site-color-button-background: #155e75;--site-color-button-background-hover: #0f3f50;--site-color-button-text: #ffffff;--site-color-focus-ring: #1f9fc8;--mantine-primary-color-filled: #155e75;--mantine-primary-color-filled-hover: #0f3f50;}</style><style data-mantine-styles="classes">@media (max-width: 35.99375em) {.mantine-visible-from-xs {display: none !important;}}@media (min-width: 36em) {.mantine-hidden-from-xs {display: none !important;}}@media (max-width: 47.99375em) {.mantine-visible-from-sm {display: none !important;}}@media (min-width: 48em) {.mantine-hidden-from-sm {display: none !important;}}@media (max-width: 61.99375em) {.mantine-visible-from-md {display: none !important;}}@media (min-width: 62em) {.mantine-hidden-from-md {display: none !important;}}@media (max-width: 74.99375em) {.mantine-visible-from-lg {display: none !important;}}@media (min-width: 75em) {.mantine-hidden-from-lg {display: none !important;}}@media (max-width: 87.99375em) {.mantine-visible-from-xl {display: none !important;}}@media (min-width: 88em) {.mantine-hidden-from-xl {display: none !important;}}</style><header class="_header_6usa8_1"><nav class="container _nav_6usa8_10" aria-label="Main navigation"><a href="/" class="_siteName_6usa8_5">Brian Yu</a><div class="_navLinks_6usa8_17"><a href="/" class="_navLink_6usa8_17">Home</a><a href="/teaching" class="_navLink_6usa8_17">Teaching</a><a href="/videos" class="_navLink_6usa8_17">Videos</a><a class="_navLink_6usa8_17 _navLink_6usa8_17 _active_6usa8_27" href="/software" data-status="active" aria-current="page">Software</a></div></nav></header><!--$--><main class="container"><div class="page"><h1>Software</h1><p>Find more of my software on<!-- --> <a href="https://github.com/brianyu28"><strong>GitHub</strong>.</a></p><section class="_project_1qcfk_1"><img class="_image_1qcfk_15" src="/projects/presenter.png" alt="Presenter.js"/><div class="_content_1qcfk_32"><h2 class="_title_1qcfk_36"><a href="https://presenter.js.org">Presenter.js</a></h2><div class="_description_1qcfk_42">A presentation tool for programmatically building animated slides</div><div class="_buttons_1qcfk_49"><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://github.com/brianyu28/presenter"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">GitHub</span></span></a><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://presenter.js.org/docs/start/"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">Docs</span></span></a></div></div></section><section class="_project_1qcfk_1"><img class="_image_1qcfk_15 _imageBorder_1qcfk_28" src="/projects/littleuseful.png" alt="Little Useful"/><div class="_content_1qcfk_32"><h2 class="_title_1qcfk_36"><a href="https://littleuseful.com">Little Useful</a></h2><div class="_description_1qcfk_42">A free, open-source collection of little, useful tools</div><div class="_buttons_1qcfk_49"><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://github.com/brianyu28/little-useful"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">GitHub</span></span></a></div></div></section><section class="_project_1qcfk_1"><img class="_image_1qcfk_15" src="/projects/classroometrics.png" alt="Classroometrics"/><div class="_content_1qcfk_32"><h2 class="_title_1qcfk_36"><a href="https://github.com/brianyu28/classroometrics">Classroometrics</a></h2><div class="_description_1qcfk_42">A live classroom feedback tool for teachers and students</div><div class="_buttons_1qcfk_49"><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://github.com/brianyu28/classroometrics"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">GitHub</span></span></a></div></div></section><section class="_project_1qcfk_1"><img class="_image_1qcfk_15" src="/projects/tenacity.png" alt="Tenacity"/><div class="_content_1qcfk_32"><h2 class="_title_1qcfk_36"><a href="https://tenacity.brianyu.me/">Tenacity</a></h2><div class="_description_1qcfk_42">An interactive game about computational thinking</div><div class="_buttons_1qcfk_49"><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://github.com/brianyu28/tenacity"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">GitHub</span></span></a></div></div></section><section class="_project_1qcfk_1"><img class="_image_1qcfk_15" src="/projects/jeopardy.png" alt="Jeopardy Player"/><div class="_content_1qcfk_32"><h2 class="_title_1qcfk_36"><a href="https://jeopardy.brianyu.me/">Jeopardy Player</a></h2><div class="_description_1qcfk_42">A web app for creating and playing custom trivia games</div><div class="_buttons_1qcfk_49"><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://github.com/brianyu28/jeopardy"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">GitHub</span></span></a></div></div></section><section class="_project_1qcfk_1"><img class="_image_1qcfk_15 _imageBorder_1qcfk_28" src="/projects/multicolor.png" alt="Multicolor"/><div class="_content_1qcfk_32"><h2 class="_title_1qcfk_36"><a href="https://github.com/brianyu28/multicolor">Multicolor</a></h2><div class="_description_1qcfk_42">A color picker and color palette utility</div><div class="_buttons_1qcfk_49"><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://github.com/brianyu28/multicolor"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">GitHub</span></span></a></div></div></section><section class="_project_1qcfk_1"><img class="_image_1qcfk_15" src="/projects/momentary.png" alt="Momentary"/><div class="_content_1qcfk_32"><h2 class="_title_1qcfk_36"><a href="https://github.com/brianyu28/momentary">Momentary</a></h2><div class="_description_1qcfk_42">A utility for converting Unix timestamps and dates</div><div class="_buttons_1qcfk_49"><a style="--button-color:var(--site-color-button-text)" class="mantine-focus-auto mantine-active m_77c9d27d mantine-Button-root m_87cf2631 mantine-UnstyledButton-root" href="https://github.com/brianyu28/momentary"><span class="m_80f1301b mantine-Button-inner"><span class="m_811560b9 mantine-Button-label">GitHub</span></span></a></div></div></section></div></main><!--/$--><footer class="site-footer"><div class="container">© <!-- -->2026<!-- --> <a href="mailto:[email protected]">Brian Yu</a></div></footer>
16<script class="$tsr" id="$tsr-stream-barrier">(self.$R=self.$R||{})["tsr"]=[];self.$_TSR={h(){this.hydrated=!0,this.c()},e(){this.streamEnded=!0,this.c()},c(){this.hydrated&&this.streamEnded&&(delete self.$_TSR,delete self.$R.tsr)},p(e){this.initialized?e():this.buffer.push(e)},buffer:[]};$_TSR.router=($R=>$R[0]={manifest:$R[1]={routes:$R[2]={__root__:$R[3]={preloads:$R[4]=["/assets/index-CY5gizDU.js"],css:$R[5]=["/assets/index-5XhEK94Y.css"],scripts:$R[6]=[$R[7]={attrs:$R[8]={type:"module",async:!0,src:"/assets/index-CY5gizDU.js"}}]},"/software":$R[9]={preloads:$R[10]=["/assets/software-BWp3RIZ9.js"],css:$R[11]=["/assets/software-DuauDN6J.css"]}}},matches:$R[12]=[$R[13]={i:"__root__�",u:1791058635538,s:"success",ssr:!0},$R[14]={i:"�software�software",u:1791058635538,s:"success",ssr:!0}],lastMatchId:"�software�software"})($R["tsr"]);$_TSR.e();document.currentScript.remove()</script>
16<script type="module" async="" src="/assets/index-CY5gizDU.js"></script>
16<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"ad42a34da63448fb9c6a0ec917f9e272","r":1,"spa":2}' crossorigin="anonymous"></script>
16
17</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.