# Chris Raible > A real human on the internet, trying his best Public Ghost content for AI and LLM tooling. This file includes a bounded export of public pages first, then recent public posts. Append `.md` to any post or page URL to get the content in Markdown (for example, `/example-post.md`). ## Pages ### About URL: https://www.chrisraible.com/about/ Last updated: 2025-10-25T06:13:50.000Z I'm Chris. I work on [Ghost](https://ghost.org/?ref=chrisraible.com), the software that runs this website. I spend my days thinking about how to build more, better software. Previously I worked at Tesla in manufacturing and quality, where I spent my days thinking about how to build more, better cars. I'm interested in the craft of building software systems that scale, working across the stack from backend services, CI/CD pipelines, provisioning and monitoring infrastructure, building frontend interfaces, and end-to-end testing. Beyond the technical aspects, I also enjoy working on the "human factors" side of software engineering. I believe that building software should be a relaxed and fun experience, both at the individual and team level, and that building reliable, performant, and delightful software is as much an emotional endeavor as an intellectual one. When I'm not working, you might find me tinkering with Home Assistant, registering domain names that I'll never use, diving down a new rabbithole on YouTube, or spending time with the people I love. This site offers a glimpse into how my brain works. I may write about things I'm working on at Ghost, tools and techniques that I use and find useful, general thoughts about where the tech industry is headed, deep dives into technologies I find interesting, or shower thoughts about the state of the world. Some of my writing will skew toward a technical audience, but I aim to keep it fairly human and personal all the same. ### End User License Agreement URL: https://www.chrisraible.com/eula/ Last updated: 2025-10-25T05:14:30.000Z > This End User License Agreement is almost definitely not legally enforceable. But it is nonetheless an agreement between you and I, as fellow users of the world wide web, at least within the jurisdiction of this website. If you are a living being, treat others with respect, and have good intentions, you don't need to read this page at all. The agreement covers our obligations to each other, and to the others reading and engaging on this site. I hope that it is all common sense and I never have to even reference this page. ## I. This is my website Not Mark Zuckerberg's. Not Elon Musk's. It's mine. It's not yours either, but you are welcome here, as long as you treat me and the other users of this site with respect. ## II. I am a human All the content on this site was written by me. The content on this site is not AI generated, except for the sake of example or demonstration, in which cases it will be clearly labelled as such. I do my best to give credit to others' for their work and ideas, but I am not perfect — if you feel I've co-opted your work or ideas in any way, I assure you that's not my intent and I encourage you to let me know so I can give you proper credit. ## III. You are a human Or else. This site isn't for bots; I reserve the right to ban or block you if it's apparent that you are a bot. Non-human intelligent living beings will be allowed on a case-by-case basis. ## III. I wrote this agreement I am the sole author of this agreement, and while I am open to and invite feedback on the contents of the agreement and my enforcement thereof, I retain full authority to write and enforce these rules. ## IV. I can change this agreement I am not infallible, and I reserve the right to be wrong and change the contents of this agreement at any time. Everything I write on this site, including this page, is a result of my best effort to put my true and honest thoughts and beliefs into words. I am constantly updating my thoughts and beliefs, and I will update this agreement accordingly as I see fit. ## V. No warranty I may share my work, recommendations and ideas on this website and elsewhere on the internet, but unless you've paid me money, I don't owe you anything other than respect. If something I've built or shared or recommended on this site stops working, or you don't like how it works, or you wish it did something else, let me know! I might fix it, but I also might not, because (unless you've paid me) I'm doing all this for free. ## VI. Just be cool Try not to take yourself or anything on this site too seriously. I maintain this site mostly for fun and to attract people with common interests into my own little social network here. Try not to be a nuisance or an asshole, and I will do the same. People make mistakes and I'm usually happy to grant second chances. If you feel I've blocked or banned you and gotten it wrong, let me know and I'm happy to reevaluate. I respect everyone's freedom of speech, but I am not a nation state; I reserve the right to moderate this site as I see fit. ## Posts ### Making music with Claude Code and the AudioContext web audio API URL: https://www.chrisraible.com/audio-context-api/ Last updated: 2026-05-15T22:51:26.000Z The [AudioContext](https://developer.mozilla.org/en-US/docs/Web/API/AudioContext?ref=chrisraible.com) interface allows you to create sound effects and music algorithmically in the browser with JavaScript, like a programmable synthesizer. I discovered this today when I wanted to add a sound effect to my site's Ghost theme, but I didn't want to go through the rigamarole of finding a recording of the sound effect, adding it as a theme asset, etc. Instead, Claude synthesized a sound effect for me in JavaScript, using the AudioContext interface. The code below is what creates the degauss sound effect: Degauss this page ```javascript const playDegaussSound = () => { const AudioContext = window.AudioContext || window.webkitAudioContext; if (!AudioContext) { return; } const context = new AudioContext(); const now = context.currentTime; const output = context.createGain(); output.gain.setValueAtTime(0.55, now); output.connect(context.destination); const playTone = ({type, frequency, endFrequency, delay = 0, duration, volume, filterFrequency}) => { const oscillator = context.createOscillator(); const gain = context.createGain(); const filter = context.createBiquadFilter(); const start = now + delay; const end = start + duration; oscillator.type = type; oscillator.frequency.setValueAtTime(frequency, start); oscillator.frequency.exponentialRampToValueAtTime(endFrequency, end); filter.type = 'lowpass'; filter.frequency.setValueAtTime(filterFrequency, start); filter.frequency.exponentialRampToValueAtTime(Math.max(40, filterFrequency * 0.25), end); gain.gain.setValueAtTime(0.0001, start); gain.gain.exponentialRampToValueAtTime(volume, start + 0.018); gain.gain.exponentialRampToValueAtTime(0.0001, end); oscillator.connect(filter); filter.connect(gain); gain.connect(output); oscillator.start(start); oscillator.stop(end + 0.02); }; const playNoiseBurst = () => { const duration = 0.12; const bufferSize = context.sampleRate * duration; const buffer = context.createBuffer(1, bufferSize, context.sampleRate); const data = buffer.getChannelData(0); const source = context.createBufferSource(); const filter = context.createBiquadFilter(); const gain = context.createGain(); for (let index = 0; index < bufferSize; index += 1) { data[index] = (Math.random() * 2 - 1) * (1 - index / bufferSize); } source.buffer = buffer; filter.type = 'bandpass'; filter.frequency.setValueAtTime(180, now); filter.Q.setValueAtTime(0.8, now); gain.gain.setValueAtTime(0.09, now); gain.gain.exponentialRampToValueAtTime(0.0001, now + duration); source.connect(filter); filter.connect(gain); gain.connect(output); source.start(now); }; playTone({ type: 'sine', frequency: 150, endFrequency: 92, duration: 0.52, volume: 0.16, filterFrequency: 520 }); playTone({ type: 'sawtooth', frequency: 260, endFrequency: 120, delay: 0.018, duration: 0.36, volume: 0.055, filterFrequency: 1100 }); playTone({ type: 'triangle', frequency: 420, endFrequency: 190, delay: 0.035, duration: 0.22, volume: 0.035, filterFrequency: 1600 }); playNoiseBurst(); window.setTimeout(() => context.close(), 950); }; ``` It's a neat, super lightweight way to add sound effects to a web app, and seems to be *mostly* used for sound effects in games, but it can just as easily be used for creating algorithmic music or instruments in your browser. After this first taste of Dunning-Kruger and AI fueled musical creation, I wanted to explore what else was possible with AudioContext. And it turns out, the answer is pretty much anything. I made what I gather is a pretty simple "subtractive synthesizer". The coolest part for me, since I know barely anything about synthesizers, is that it visualizes the wave forms *live* in your browser, so you can visualize the tones you're creating and see how they change as you adjust all the knobs and play different tones. [Code](https://github.com/cmraible/websynth?ref=chrisraible.com) and [demo](https://synth.chrisraible.com/?ref=chrisraible.com) for the curious. ![](https://storage.ghost.io/c/94/0b/940b73e9-4952-4752-b23d-9486f999c47e/content/images/2026/05/image.png) I found the XY Pad particularly fun to play with using a trackpad or phone: ![](https://storage.ghost.io/c/94/0b/940b73e9-4952-4752-b23d-9486f999c47e/content/images/2026/05/image-1.png) I'm sure the visualization isn't *perfect* but from my rudimentary understanding of all these concepts it's at least directionally correct. Apparently there’s also a [Web MIDI API](https://developer.mozilla.org/en-US/docs/Web/API/Web%5FMIDI%5FAPI?ref=chrisraible.com) to interface with hardware MIDI controllers too. This was a neat experiment, but I really have no idea what I'm doing here, and the little single html + javascript file app doesn't really allow you to record a song or anything like that (not that I'd have a clue how to do that to begin with). But it got me thinking: could Claude generate a decent song *in code*? One prompt and 2 minutes later, Claude Code generated an [impressively complex instrumental song in pure JavaScript](https://synth.chrisraible.com/song.html?ref=chrisraible.com). You can read the source code of the song the magic computer in the sky composed [here](https://github.com/cmraible/websynth/blob/main/song.js?ref=chrisraible.com). > You can read the source code of the song the magic computer in the sky composed [here](https://github.com/cmraible/websynth/blob/main/song.js?ref=chrisraible.com). (he repeated for emphasis) What a wild time to be alive. Something something copyright law. Something something [player piano](https://en.wikipedia.org/wiki/Player%5FPiano%5F%28novel%29?ref=chrisraible.com). ### Writing on the internet is hard URL: https://www.chrisraible.com/writing-on-the-internet-is-hard/ Last updated: 2025-10-29T17:43:14.000Z I work for a company called Ghost, which runs an [internet publishing platform](https://ghost.org/?ref=chrisraible.com) — the same platform that served you this website. In a very real way, people writing on the internet is currently responsible for my livelihood. It pays for the food I eat, my healthcare, the roof over my head, and my dog's monthly appointment with the vet tech to get his anal glands expressed. If everyone suddenly stopped writing on the internet, I'd be out of a really good job, and I'd have to find a different way to spend my time and make a living. I've seen the positive impact that writing on the internet can have on people's lives. Many of our customers at Ghost have been able to provide for themselves and their families by consistently writing on the internet, freeing themselves from the corporate grind and providing a lifestyle that would have been unimaginable even 20 years ago. It's by no means a get rich quick scheme, but there are plenty of real people who've been able to independently make a good living just by sharing their thoughts with the world on a regular cadence. I know that I *should* write on the internet more, and I want to, but I always struggle to actually do it. I've redesigned this site numerous times over the years (as is my duty as a web developer), but as you can plainly see, I've never really published *anything* other than a basic About page. Writing on the internet may not be the same kind of hard as, say, doing manual labor in a field or factory, but it *is hard.* Writing is hard on its own, even without publishing it to the whole world. It requires a degree of focus and clarity of thought and mental energy that I'm frankly not always blessed with, especially after spending most of my days reading and writing pretty much non-stop in the course of my day job. When you add the emotional effort required to actually *share* the things I write with the world, my brain seems to just halt and catch fire. Sharing your ideas with the internet is an act that requires vulnerability, and overcoming my own insecurities enough to even contemplate doing so seems to consume all my mental energy, leaving nothing left to actually do the writing itself. What should I write about? Who cares about what I have to say? Does the world need another take on AI from another white guy living in Silicon Valley? Do I have even a single original idea that is worth sharing with the world? What if everyone finally finds out that actually I'm an idiot and a fraud? What if my grandmother reads it and she's disappointed in me for spending my Sundays tinkering with home assistant instead of going to church? What if I read my own writing 2 years from now and inevitably cringe at my own words and ideas? These questions seem to take up all the space in my head, leaving no room for coherent thoughts to make their way out in an orderly fashion. But despite the difficulty of the act itself, and despite my insecurities getting in the way, and despite the numerous false starts I've had over the years, the *idea* of consistently writing on the internet is something that I keep coming back to. And *usually* it's the ideas that I keep coming back to that turn out to be the most important. So buckle up, reader, for this is just the beginning. I'm going to *try* to start writing on the internet more. As in, actually *try.* And I'm going to try to be as authentically myself as I can, and I'm going to try not to filter or edit myself too much, and I'm going to try not to take myself too seriously. I don't know what I'll write about, and I make no commitment to sticking to any particular niche, but damn it I'm going to write! I'll probably write about technology, and my nerdy job and my nerdy hobbies. I might write about sports or politics or process improvement or why the San Jose airport's location is both a blessing and a curse. I might write things that I'm not even sure if I believe, just to see how it feels. I might write about things that are offensive to some people, I will *definitely* curse and I will probably write things that will disqualify me for future job opportunities or a future in politics, and that's a risk that I am willing to take. I will probably go long periods of time without posting here. I will probably be very active for a month or two and then disappear long enough for you to forget that I exist, only to reappear with strong opinions about how annoying it is that every SaaS tool in the world now has documents, an issue tracker and a chatbot, so we all just spend our days searching for that thing our coworker said 2 months ago in that Slack channel...or was it in a Notion comment, or in a Linear document, or was it a Slack canvas, or a Github issue? I will definitely be wrong about things all the time, and I will sometimes be open-minded and brave enough to eventually recognize it when I'm wrong, and I reserve the write to change my mind about anything and everything I write. Most of all, I hope that I get better as I go, not only at the writing bits, but at the everyday-being-a-human bits. Much like physical exercise, writing on the internet feels like an activity that is hard because it is in fact good for me, and it's not meant to be easy, because doing easy things doesn't often lead to growth. I will definitely cringe at myself for having written this as soon as I hit publish, but if *you* enjoyed reading this for some reason that I can't currently comprehend, then you're probably exactly the type of person I'd love to meet. Please reach out and introduce yourself if you feel so inclined, and if you're really feeling brave, you can subscribe to receive more of my incoherent ramblings straight to your inbox at irregular intervals.