\9 \9 \9 \9 \9 \9 \9 \9 ");width:.75em;height:.75em;margin-bottom:-.1em;margin-left:.25em;display:inline-block}@media screen and (width<=1200px){body>.page header nav .row .left,body>.page header nav .row .right{--height:50px;--button-padding:16px;--nav-font-size:24px;gap:30px}}@media screen and (width<=1000px){body>.page header nav .row .left,body>.page header nav .row .right{--button-padding:14px;--nav-font-size:20px;gap:30px}}@media print,screen and (width<=900px){body>.page header nav .row .left,body>.page header nav .row .right{--height:40px;--button-padding:13px;--nav-font-size:18px;gap:20px}}@media print,screen and (width<=780px){body>.page header nav .row .left,body>.page header nav .row .right{--button-padding:12px;--nav-font-size:16px;gap:20px}}@media screen and (width<=680px){body>.page header nav .row .left,body>.page header nav .row .right{--height:30px;--button-padding:8px;--nav-font-size:14px;gap:16px}}@media screen and (width<=580px){body>.page header nav .row .left,body>.page header nav .row .right{--height:24px;--nav-font-size:13px;gap:12px}}@media screen and (width<=520px){body>.page header nav .row .left,body>.page header nav .row .right{--height:22px;--button-padding:6px;--nav-font-size:12px;gap:10px}}@media screen and (width<=460px){body>.page header nav .row .left,body>.page header nav .row .right{--height:20px;--button-padding:4px;--nav-font-size:11px;gap:8px}}@media screen and (width<=420px){body>.page header nav .row .left,body>.page header nav .row .right{--nav-font-size:10px;gap:6px}}@media screen and (width<=380px){body>.page header nav .row .left,body>.page header nav .row .right{--nav-font-size:9px;gap:6px}}@media screen and (width<=350px){body>.page header nav .row .left,body>.page header nav .row .right{--nav-font-size:8px;gap:6px}}body>.page header .ripple{fill:#fff;stroke:currentColor;--ripple-height:16px;height:var(--ripple-height);margin-top:calc(-1*var(--ripple-height) + var(--border-thickness));margin-bottom:calc(-1*var(--border-thickness));stroke-width:var(--border-thickness);background:0 0;display:block}body>.page header .ripple:before,body>.page header .ripple:after{content:none}body>.page header hr{background:0 0}@media screen and (width<=1400px){body>.page header .ripple{width:calc(100% + var(--page-edge-padding)*2);margin-left:calc(-1*var(--page-edge-padding));margin-right:calc(-1*var(--page-edge-padding))}body>.page header hr{display:none}}body>.page main{padding:calc(120*var(--variable-px))var(--page-edge-padding)}body>.page main>section{max-width:var(--max-width);z-index:1;margin-left:auto;margin-right:auto;position:relative}body>.page main>section~section{margin-top:calc(120*var(--variable-px))}body>.page main>section p img{max-width:100%}body>.page main>section pre{box-sizing:border-box;overflow:auto}body>.page main>section details{width:100%}body>.page main>section details summary{padding-left:18px;font-weight:800;display:inline-block;position:relative}body>.page main>section details summary:before{content:"";background:url("data:image/svg+xml;utf8,\9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 \9 ");width:10px;height:10px;margin:auto;position:absolute;top:0;bottom:0;left:0}body>.page main>section details summary+*{margin-top:20px}body>.page main>section details[open] summary:before{transform:rotate(90deg)}body>.page footer{color:var(--color-walnut);flex-direction:column;align-items:center;padding:0 40px 40px;display:flex}@media screen and (width<=1400px){body>.page footer hr{width:100%}body>.page footer hr:before,body>.page footer hr:after{width:calc(var(--page-edge-padding) + 40px);height:var(--border-thickness);background:currentColor;border:none}}body>.page footer nav{flex-wrap:wrap;justify-content:center;gap:8px 40px;margin-top:40px;display:flex}body>.page footer nav a{color:var(--color-walnut)}@media screen and (width<=900px){body>.page footer nav{max-width:500px}}@media screen and (width<=780px){body>.page footer nav{max-width:440px}}@media screen and (width<=400px){body>.page footer nav{gap:6px 20px}}body>.page footer span{text-align:center;margin-top:40px}:is(h1,h2,h3,h4,article>:first-child,details>summary)~:is(p,ul,ol,ol li p,img,a:has(>img:only-child)),:is(h1,h2,h3,h4,article>:first-child)~:is(ul,ol) li p+img,:is(h1,h2,h3,h4,p)~.feature-icons,p~:is(h1,h2,h3,h4,details summary,blockquote,.image-comparison,.video-background,.youtube-embed),.youtube-embed+:is(p,.link,.button),p+p>.button,p+:is(.link,section,details),table td p~p,img+.link,article{margin-top:20px}*{min-width:0;min-height:0}h1{font-feature-settings:"lnum";margin:0;font-family:Bona Nova,Palatino,serif;font-size:2.66667rem;font-weight:700;line-height:1.25;display:inline-block}h1~h2{margin-top:40px}h1~hr{margin-top:40px;margin-bottom:20px}h2,h3,h4,h5,h6{margin:0;font-family:Inter,sans-serif;font-weight:800;line-height:1.5;display:inline-block}h2{font-size:1.77778rem;font-weight:700}h3{font-size:1.33333rem}h4,h5,h6{font-size:1rem}p{text-align:justify;text-justify:inter-character;-webkit-hyphens:auto;hyphens:auto;margin:0}p code{text-justify:auto}h1~img,h1~iframe,h1~a>img:only-child,h2~img,h2~iframe,h2~a>img:only-child,h3~img,h3~iframe,h3~a>img:only-child,h4~img,h4~iframe,h4~a>img:only-child,h5~img,h5~iframe,h5~a>img:only-child,h6~img,h6~iframe,h6~a>img:only-child,p~img,p~iframe,p~a>img:only-child{width:100%;height:auto}a{color:var(--color-crimson)}img{vertical-align:top}table{width:calc(100% + 40px);margin:20px -20px}table th,table td{vertical-align:top;border:20px solid #0000;margin:0;padding:0}table th:not(:first-child) img,table td:not(:first-child) img{max-width:100%}table th:empty{border:none}:is(h1,h2,h3,h4,h5,h6)+table{margin-top:0}ul,ol{margin:0}ul+p,ol+p{margin-top:0}ul li,ol li{margin-top:.5em}hr{color:unset}code{color:#000;background:var(--color-fog);overflow-wrap:anywhere;-webkit-hyphens:none;hyphens:none;padding:0 4px}a code{color:var(--color-crimson)}kbd{outline:calc(var(--border-thickness)/2)solid var(--color-navy);color:inherit;margin:0 4px;padding:0 8px;font-family:inherit}summary{cursor:pointer}hr{overflow:visible}hr,.ripple{height:var(--border-thickness);background:currentColor;border:none;width:calc(100% - 64px);margin:0 32px;position:relative}hr:before,.ripple:before{border-width:0 0 var(--border-thickness)40px;left:-40px}hr:after,.ripple:after{border-width:0 40px var(--border-thickness)0;right:-40px}hr:before,hr:after,.ripple:before,.ripple:after{content:"";border-style:solid;border-color:#0000 #0000 currentColor;width:0;height:0;display:block;position:absolute}.block{flex-direction:column;align-items:flex-start;width:100%;display:flex}.block.centered{align-items:center}:not(.diptych,.triptych)>.block+.block{margin-top:calc(120*var(--variable-px))}.link{font-size:var(--font-size-link);color:var(--color-crimson);white-space:nowrap;font-weight:800;text-decoration:none;display:inline-block}.link:not(.not-uppercase){text-transform:uppercase}.button{border:var(--border-thickness)solid currentColor;min-height:calc(var(--font-size-link)*2);font-size:var(--font-size-link);padding:0 var(--font-size-link);box-sizing:border-box;text-align:left;color:var(--color-crimson);font-weight:800;text-decoration:none;display:inline-block}.button:before{content:"";line-height:calc(var(--font-size-link)*2 - 2*var(--border-thickness))}.button img{height:calc(var(--font-size-link)*1.5);margin-right:calc(var(--font-size-link)/2)}.button img,.button span{vertical-align:middle}.arrow:after{content:" »";font-family:Inter,sans-serif}.video-background{font-size:0;position:relative}.video-background video{max-width:min(100%,1280px)}.video-background:after{content:"";pointer-events:none;border:2px solid #fff;position:absolute;inset:0}
Internships for a Rust graphics engine: GSoC 2025
By Keavon Chambers. April 02, 2025.
Do you love Rust and focus on computer graphics, compiler development, or algorithm research? Students (and non-students who are new to open source contribution) interested in a paid summer internship are invited to apply this week to Graphite's Google Summer of Code 2025 program. The deadline is April 8 at 18:00 UTC.
Graphite is a data-driven creative design engine that combines an artist-friendly image editing environment with a procedural graphics renderer built with Graphene, a custom Rust-based compiled functional programming language for portable, scriptable graphics pipelines.
Hear from our mentoring team about Graphite's tech stack and engineering vision by listening to last month's episode of the Developer Voices podcast:
For GSoC 2025, our priority focus is mentoring projects revolving around advanced graphics techniques and compiler development, meeting our goal of extending Graphite into the domain of raster image manipulation. Demonstrated experience in these areas is highly advantageous.
Outstanding applicants tend to be competent, self-directed, productive, and confidence-inspiring. If you're driven to learn and explore cutting-edge engineering challenges, please get in touch and we will help you get up to speed and assist in submitting a timely application.
Inventing efficient rendering of connected "mesh vector" Bézier geometry
Extending the Graphene compiler to run GPU compute shader graphics pipelines
Implementing bidirectional type inference into the Graphene type system
Developing a graph theory-based system for equivalence rewriting of nodes
Creating an efficient brush rendering system for large painted path datasets
Managing colors through flexible use of color spaces, color models, and color profiles
Researching an assortment of algorithms for image processing operations
Engineering solutions for combining Tauri's webview and Graphite's WGPU renderer in the same window across Windows, Mac, and Linux desktop applications
These recently added projects are pending an extended description, but we'll be happy to discuss the details if you pop into our Discord server and introduce yourself with links to related experience and projects.
Outside GSoC, additional year-round opportunities are available for student capstone or independent research projects. These are run similarly, but are also available to multi-person groups. They provide academic credit instead of a stipend. Reach out anytime if interested.