This is my homepage. Feel free to poke around, the site is built with Metalsmith, a static site generator built in Node.js. I've used a number of plugins from a number of very nice people (you can see the plugins in my package.json file).
If you have any suggestions (content, bug fixes, etc) feel free to make a GitHub issue for them, or submit a PR!
The pages of the site are organized under the /content
directory as *.html
pages. Each of these points to a layout template in the /layouts
directory. The layouts are written in handlebars (*.hbs
). There are some partial, reused layout files in the /layouts/partials
directory for things like the header, footer, and navigation.
The "profile" and "games" pages also have their content in those *.html
pages in /content
, but the home page (index.html
) and the "events" page (events.html
) are just containers for the blog and speaking event data respectively.
The metalsmith config (in metalsmith.json
) specifies how the blog posts are pulled in. They're all located in the /content/posts
directory. Although that directory is sorted alphabetically according to whatever your operating system likes to do, the posts are ordered on the site (and paginated) by metalsmith using the "date" field. Each post is a markdown file, and they each have metadata at the top.
For example, the "My First Cohort" post has this metadata:
---
title: My First Cohort
collection: posts
date: 2016-05-14
tags: learning, mentorship, jobs, community
---
The date
field above is used to properly order this post among the others. The tags
are used for the word cloud, and the collection
allows metalsmith to distinguish this content from static pages. The title
should be obvious! Of course, the markdown content is converted to HTML during the build process.
To add a new blog post, we simply need to create the markdown file - with the proper metadata at the top - and rebuild the site. Then we publish it using Netlify (see details further down).
I have spoken at many events over the years. I generally host any presentation materials on my website. Those are all located in the /content/presos
directory. Under that directory, each presentation is its own self-contained mini-site. They use a special presentation layout to centralize the common stuff like my reveal.js plugins and such, but otherwise everything is in there: all of the slides, images, etc.
Each presentation directory is also the path used to access it on my website. In other words, the /content/presos/civictech
directory will be exposed as https://jordankasper.com/civictech
The last piece of content is the list of events available on https://jordankasper.com/events, which is all stored as a large JSON file in the /plugins
directory. Each entry in this file will display as a single event on the site. The metadata here - like that of the blog posts - will be used for ordering and display.
For example, this is the entry for my talk on Open Source at the Frontrunners conference in 2023:
{
"name": "Frontrunners",
"url": "https://frontrunners.tech/",
"location": "Arlington, VA",
"date": "Mar 10 2023",
"topics": [
"Open Source in Civic Tech"
]
}
There are some other assets (the site's JavaScript, CSS, etc) which is all located in the /assets
directory.
There are also a few non-dynamic static pages in there under /assets/static
. These are not dynamically built with metalsmith. Instead, this content is served up as is with no injection. This is accomplished using a copy
task during the metalsmith build. Check out the /plugins/copy.js
file to see how that's done.
Building the site is pretty simple, make sure you have all of the dependencies, run the clean
command, then the build
command:
npm install
npm run clean
npm run build
How is this all done? Well, the site is built using metalsmith, which itself is highly customizable (one reason I like it). In fact, all of the *.js
files in the /plugins
directory are tiny metalsmith plugins. You can see how they are then used in the metalsmith.json
configuration file.
If things aren't going well, you should look at the full debug output using:
npm run debug
The final, static site will be in the /build
directory and you can run the site using your favorite HTTP server tool, serving content from that directory. For example, in Node you could use: http-server ./build
(presuming you had installed the http-server Node module globally).
This site is deployed to Netlify. To do this, you will need to install the Netlify CLI tool:
npm i -g netlify-cli
Note that currently automated deployments are not enabled.
You will need to login using the Netlify CLI (using netlify login
) and then publish the site:
netlify deploy
This command will generate a preview site that you can check out. Of course, you should have already tested the site thoroughly locally first. Once you're ready to deploy the production site, run:
netlify deploy --prod
This site is copyright Jordan Kasper, 2018-2024, all rights reserved.
You are welcome to reuse the code in the /plugins
directory as you wish, under an MIT license. However, all other content, especially the written content in the /content
and /assets/static
directories, is reserved with no permissions.