This Friday I’ll be a panelist on a session about AI and the future of work here at Datapalooza, our signature data science conference (register free). The panel will be run by students, taking questions from students on career prep and advice.
One strong piece of advice I’ll give: you need a personal website.
Especially if you’re a student or postdoc looking to land that first job. In a previous blog post I wrote about being a property owner (not a renter) online, and owning your own content and audience. From here you can link out to things like your GitHub, LinkedIn, Google Scholar, ORCID, blog/newsletter, social media, whatever. To do this you need a personal website on a domain you own and control.1
Static sites
I use a static site for stephenturner.us. This means that the entire website is just a collection of HTML and CSS. Files that are served to you, that your browser renders just as they exist on the server, without any back-end database queries (like in Wordpress) or server-side processing. I.e., you create the HTML files, dump them somewhere online, and point your domain to that location.
There are tons of static site generators. Hugo and Jekyll are both popular. They’re both overkill for me. I don’t know anything about Ruby or Go, and I don’t care to learn about either. For many years I used Sean Kross’s postcards R package to do this with RMarkdown. It’s great, but it was overkill as well.
My static website now is just a few markdown files along with a Makefile. I type make and all the markdown gets rendered into HTML following a template. I push those files to a private GitHub repo (free), and I use Netlify (free) to deploy that website at my own domain, stephenturner.us. The whole update and deployment process is a simple make && git push. My domain is the only thing I pay for ($8/year). The whole website is ~100kb. It’s just HTML+CSS. And it looks fine on desktop and mobile. I’ll show you how to do this below.

How to use my template
I put the source code for the template site here on GitHub. You can see what it looks like rendered here: markdownhomepage.github.io.

Ideally you’d buy a domain and tell Netlify to serve the repo from your personal domain instead of using a github.io page, but the latter works if you don’t want to fool around with a domain name and DNS (just ask ChatGPT or Claude how to do this, it’s easy).
The setup is pretty simple, and is explained in the README. You edit the index.md to put whatever you want in the body. You can control what goes in the buttons at the bottom with some YAML front matter.
---
title: Jerry the Cat
description: "Jerry is a beautiful Persian cat. He likes pets."
image: files/headshot.jpg
home: true
links:
- label: Newsletter
url: "https://blog.stephenturner.us/"
- label: GitHub
url: "https://github.com/stephenturner"
- label: LinkedIn
url: "https://www.linkedin.com/in/turnersd/"
---
I'm a research scientist at [Example University](https://example.edu/)
studying the impact of treats and pets on feline well-being and life satisfaction.
Replace this paragraph with two or three sentences about what you do.
Add a second paragraph for your background, current projects, or books.
Everything here is plain Markdown, and the buttons below come from
the `links` list in the frontmatter.
The code for this repo is available
[here on GitHub](https://github.com/markdownhomepage/markdownhomepage.github.io).You can also optionally include sub-pages in a subdirectory called p/. I use this to maintain a small collection of short personal writings that don’t make sense to publish here as a blog post. Examples from my own homepage:
stephenturner.us/p/cocktails: I got way too into craft cocktails during the pandemic. I saved some of my favorite recipes here to make it easier to find wherever I am.
stephenturner.us/p/ebike: evangelical praise for e-bikes.
stephenturner.us/p/i-dont-read-ai-generated-emails: I don’t read or respond to obviously AI-generated emails, period. I link to this from my contact page.
Edit the index.md and whatever markdown files in p/ that you wish, run make, which converts all the markdown into flat HTML files using a very simple HTML template and stylesheet. It makes a sitemap.xml while doing so to help Google and other AIs index your site.
Extras
You can also edit an included site.yml file, which controls how site metadata is embedded into every page when markdown is compiled to HTML via the template.
It’s just HTML and CSS, things AI knows very well. Want to change colors or fonts or spacing or margins? Any frontier model or sub-frontier open weight model can easily do this for you.
Speaking of frontier models… I don’t know if this helps AI engine optimization, but all the original markdown files are also served. E.g., index.md, cocktails.md, ebike.md.
You can include things in the files/ subdirectory, which become exposed and available online. For example, while I keep a private dotfiles repo on GitHub with all my configurations and such, I do keep this repo private on the off chance I accidentally commit something I don’t want to. But when I log into a new machine where I don’t have my GitHub credentials already set up, I can’t live without some minimal setup, like my vimrc, tmux.conf. So I just keep these online that I can curl/wget fairly easily.
If you’re doing what I recommend and using Netlify to deploy your site at your personal domain from a private GitHub repo, you can use Netlify’s built-in feature to enable redirects by editing the _redirects file. Sort of like having your own vanity URL shortener to get to those URLs you can’t easily remember. For example:
stephenturner.us/scholar redirects to my Google Scholar page
stephenturner.us/complain redirects to a place to leave feedback or complaints
stephenturner.us/orcid redirects to my ORCID (I can’t remember it)
stephenturner.us/kegerator redirects to some engineering / technical writing I did years ago for a homebrewing magazine
stephenturner.us/aiemail: you can also redirect to longer internal URLs like this, which redirects to my page described above about why I neither read nor respond to AI-generated email.
Outside of this static site, once you own your own domain, you can set up subdomains pointing to any number of other resources. Examples:
blog.stephenturner.us: the newsletter you’re reading now. The blog is hosted on Substack, but with a custom subdomain set up via Netlify. Again, if my blogging platform starts to annoy me, I can take my content and audience anywhere else I wish, and the links will still work.
dstt.stephenturner.us: My 2026 Data Science Team Training textbook. Hosted on GitHub, deployed via Netlify.
bdsr.stephenturner.us: My 2019 Biological Data Science with R textbook. Hosted on GitHub, deployed via Netlify.
genodemos.stephenturner.us: A vibe-coded project for genomics teaching demos. Hosted on GitHub, deployed via Netlify.
lab.stephenturner.us: My new lab website that I launched last week. Read on…
Going further: a lab website
I use a similar setup for my lab website, lab.stephenturner.us.2

It’s the same basic idea, only dependencies are make and pandoc: I have a few markdown files and a Makefile. I type make and pandoc creates all the HTML files, and I run git push to a private GitHub repo, and Netlify deploys the site at the lab. subdomain. All free, using my same domain I use for my personal homepage at no additional cost beyond the $8/year for the domain.
There are no flashy pictures or graphics or fancy mouse-hijacking scrolly animations or Javascript or parallax or jQuery or whatever other modern UI junk (grug). The entire website is 5kb, loads in ~300ms, and takes <1 second to render from markdown.
There’s also some extra fun stuff happening here that I don’t have in my personal homepage.
There’s a news feed that I control through a separate YAML file that gets injected into the index.md/html at render time.
The people page is just populated by a YAML file where I create students/staff, add a bio and a position (Undergrad, PhD, postdoc, etc). Later I can change alumni: true and they get moved to the bottom and the headshot photo goes away.
The really slick thing is the publications page, which uses some Pandoc Lua filters to create, sort, and display the lab’s publications when I render the markdown to HTML. I just drop in a BiBTeX file with all my publications into the root of the website directory (exported from a “My Publications” folder in Zotero I’ve maintained since 2008). When I run make to render the HTML, it first looks at the YAML file that controls the people page, matches people in that YAML with author names in the BiBTeX, and makes them boldface in the rendered publication list. This is super useful in big consortium papers. For example, last month we published a preprint on influenza hospitalization forecasting with dozens of authors from academia, industry, the CDC, and other organizations. I’m a secondary / co-mentor to a PhD student here, VP Nagraj, who’s also been a long-time collaborator of mine before he started the program here. VP Nagraj is squarely in the middle of the author list, and I’m near the last. Because we’re both on the people.yaml file, when Pandoc renders the HTML using the BiBTeX file, it knows to abbreviate the author list, but to NOT chop out my name or his, instead bolding our names and putting some ellipses in the right place.
Jessica T. Davis, Gursharn Kaur, Annabella Hines, Michal Ben-Nun, Srinivasan Venkatramanan, …, V. P. Nagraj, …, Stephen D. Turner, …, Rebecca K. Borchering. Multi-season evaluation and analysis of categorical trend forecasts of influenza hospital admissions in the United States. medRxiv, 2026. DOI URL
Own your content and domain
My first personal website was hosted on Geocities (man, I miss the days of the internet being fun back in the 1990s). Later I used Google Sites (enshittified). If you own your domain and use a static site like I do here, you aren’t subject to the whims of whatever third-party platform decides to do. If GitHub and Netlify shut down tomorrow (extremely unlikely), I can have my website back up and running hosted one of many other places within minutes. Pay the $1/month or less for your own personal domain and be a property owner on the internet, not a renter.
Your “institutional profile” on your company or department website isn’t good enough. I’ve had 14 different “official” institutional profiles and email addresses at various universities and companies I’ve been involved with over the past 20 years (Vanderbilt, VUMC, University of Hawaii, University of Virginia, Colossal, Form Bio, Signature Science, University of Virginia again, and a handful of stealthy ventures and other affiliations I can’t discuss). My current UVA SDS profile is the only one that still lives. OTOH, I’ve had my personal email address for over 20 years, and my personal stephenturner.us domain for almost long. They’ll stick with me as I move around, long outliving whatever transient “institutional” profile might come and go along the way.
I don’t have a template I can share, but leave a comment if you’d like to see one and I can remove some personal information and create a public template on GitHub.
