diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000000000..1ab391e9f0bfb --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,25 @@ +name: Check Pages build + +on: + pull_request: + push: + branches: [master] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - name: Build with the GitHub Pages toolchain + uses: actions/jekyll-build-pages@v1 + with: + source: ./ + destination: ./_site + - uses: actions/upload-pages-artifact@v3 + with: + path: ./_site + retention-days: 1 diff --git a/README.md b/README.md index 45c202063a374..196b0a18158a1 100644 --- a/README.md +++ b/README.md @@ -1,120 +1,46 @@ -> March, 2016: If you're on an old version of Jekyll Now and run into a) build warnings or b) syntax highlighting issues caused by [Jekyll 3 and GitHub Pages updates](https://github.com/blog/2100-github-pages-now-faster-and-simpler-with-jekyll-3-0), just :sparkles:[update your _config.yml](https://github.com/barryclark/jekyll-now/pull/445/files):sparkles: and you'll be set! +# Michael Neeley’s portfolio -# Jekyll Now +https://redreceipt.github.io/ -**Jekyll** is a static site generator that's perfect for GitHub hosted blogs ([Jekyll Repository](https://github.com/jekyll/jekyll)) +A handwritten HTML + CSS portfolio. No JavaScript, framework, package manager, +web fonts, tracking, or API calls. The homepage is served as written. -**Jekyll Now** makes it easier to create your Jekyll blog, by eliminating a lot of the up front setup. +## Preview -- You don't need to touch the command line -- You don't need to install/configure ruby, rvm/rbenv, ruby gems :relaxed: -- You don't need to install runtime dependencies like markdown processors, Pygments, etc -- If you're on Windows, this will make setting up Jekyll a lot easier -- It's easy to try out, you can just delete your forked repository if you don't like it +From this directory: -In a few minutes you'll be set up with a minimal, responsive blog like the one below giving you more time to spend on writing epic blog posts! +```sh +python3 -m http.server 8000 --bind 127.0.0.1 +``` -![Jekyll Now Theme Screenshot](/images/jekyll-now-theme-screenshot.jpg "Jekyll Now Theme Screenshot") +Open http://127.0.0.1:8000/. No install or build step is needed for the portfolio. -## Quick Start +## Update the gallery -### Step 1) Fork Jekyll Now to your User Repository +Edit the project cards in `index.html` and styles in `portfolio.css`. +Keep the selection small: original public projects with recent development, +useful documentation, and something meaningful to inspect or try. Do not +include private repositories or present upstream forks as original work. -Fork this repo, then rename the repository to yourgithubusername.github.io. +The current selection is Lamplight and Animal Mania, both active in October 2026. +Links and project descriptions are deliberately curated, not fetched in the +browser. Revisit the selection when projects change; there is no automatic sync. -Your Jekyll blog will often be viewable immediately at (if it's not, you can often force it to build by completing step 2) +`assets/animal-mania.webp` is a real gameplay capture from animalmania.app, +resized to 800px wide and encoded as WebP. The Lamplight preview is an HTML +workflow diagram, not a screenshot or claimed execution output. Keep images +local, specify dimensions, and keep the total homepage payload below 100 KB. -![Step 1](/images/step1.gif "Step 1") +## Publishing and older content -### Step 2) Customize and view your site +GitHub Pages already publishes `master` at the repository root. Merging the +portfolio PR will update the homepage; pushing a feature branch does not +publish it. No Pages settings changes are needed. -Enter your site name, description, avatar and many other options by editing the _config.yml file. You can easily turn on Google Analytics tracking, Disqus commenting and social icons here too. +The original Jekyll configuration, layouts, posts, and conference pages remain +to preserve older URLs. The malformed collection default in `_config.yml` +has been fixed so Pages can build again. Jekyll processes the legacy Markdown +and Sass only; the portfolio has no front matter, Liquid, or generated content. +The Python preview shows the new portfolio, not the rendered legacy pages. -Making a change to _config.yml (or any file in your repository) will force GitHub Pages to rebuild your site with jekyll. Your rebuilt site will be viewable a few seconds later at - if not, give it ten minutes as GitHub suggests and it'll appear soon - -> There are 3 different ways that you can make changes to your blog's files: - -> 1. Edit files within your new username.github.io repository in the browser at GitHub.com (shown below). -> 2. Use a third party GitHub content editor, like [Prose by Development Seed](http://prose.io). It's optimized for use with Jekyll making markdown editing, writing drafts, and uploading images really easy. -> 3. Clone down your repository and make updates locally, then push them to your GitHub repository. - -![_config.yml](/images/config.png "_config.yml") - -### Step 3) Publish your first blog post - -Edit `/_posts/2014-3-3-Hello-World.md` to publish your first blog post. This [Markdown Cheatsheet](http://www.jekyllnow.com/Markdown-Style-Guide/) might come in handy. - -![First Post](/images/first-post.png "First Post") - -> You can add additional posts in the browser on GitHub.com too! Just hit the + icon in `/_posts/` to create new content. Just make sure to include the [front-matter](http://jekyllrb.com/docs/frontmatter/) block at the top of each new blog post and make sure the post's filename is in this format: year-month-day-title.md - -## Local Development - -1. Install Jekyll and plug-ins in one fell swoop. `gem install github-pages` This mirrors the plug-ins used by GitHub Pages on your local machine including Jekyll, Sass, etc. -2. Clone down your fork `git clone https://github.com/yourusername/yourusername.github.io.git` -3. Serve the site and watch for markup/sass changes `jekyll serve` -4. View your website at http://127.0.0.1:4000/ -5. Commit any changes and push everything to the master branch of your GitHub user repository. GitHub Pages will then rebuild and serve your website. - -## Moar! - -I've created a more detailed walkthrough, [**Build A Blog With Jekyll And GitHub Pages**](http://www.smashingmagazine.com/2014/08/01/build-blog-jekyll-github-pages/) over at the Smashing Magazine website. Check it out if you'd like a more detailed walkthrough and some background on Jekyll. :metal: - -It covers: - -- A more detailed walkthrough of setting up your Jekyll blog -- Common issues that you might encounter while using Jekyll -- Importing from Wordpress, using your own domain name, and blogging in your favorite editor -- Theming in Jekyll, with Liquid templating examples -- A quick look at Jekyll 2.0’s new features, including Sass/Coffeescript support and Collections - -## Jekyll Now Features - -✓ Command-line free _fork-first workflow_, using GitHub.com to create, customize and post to your blog -✓ Fully responsive and mobile optimized base theme (**[Theme Demo](http://jekyllnow.com)**) -✓ Sass/Coffeescript support using Jekyll 2.0 -✓ Free hosting on your GitHub Pages user site -✓ Markdown blogging -✓ Syntax highlighting -✓ Disqus commenting -✓ Google Analytics integration -✓ SVG social icons for your footer -✓ 3 http requests, including your avatar - -✘ No installing dependencies -✘ No need to set up local development -✘ No configuring plugins -✘ No need to spend time on theming -✘ More time to code other things ... wait ✓! - -## Questions? - -[Open an Issue](https://github.com/barryclark/jekyll-now/issues/new) and let's chat! - -## Other forkable themes - -You can use the [Quick Start](https://github.com/barryclark/jekyll-now#quick-start) workflow with other themes that are set up to be forked too! Here are some of my favorites: - -- [Hyde](https://github.com/poole/hyde) by MDO -- [Lanyon](https://github.com/poole/lanyon) by MDO -- [mojombo.github.io](https://github.com/mojombo/mojombo.github.io) by Tom Preston-Werner -- [Left](https://github.com/holman/left) by Zach Holman -- [Minimal Mistakes](https://github.com/mmistakes/minimal-mistakes) by Michael Rose -- [Skinny Bones](https://github.com/mmistakes/skinny-bones-jekyll) by Michael Rose - -## Credits - -- [Jekyll](https://github.com/jekyll/jekyll) - Thanks to its creators, contributors and maintainers. -- [SVG icons](https://github.com/neilorangepeel/Free-Social-Icons) - Thanks, Neil Orange Peel. They're beautiful. -- [Solarized Light Pygments](https://gist.github.com/edwardhotchkiss/2005058) - Thanks, Edward. -- [Joel Glovier](http://joelglovier.com/writing/) - Great Jekyll articles. I used Joel's feed.xml in this repository. -- [David Furnes](https://github.com/dfurnes), [Jon Uy](https://github.com/jonuy), [Luke Patton](https://github.com/lkpttn) - Thanks for the design/code reviews. -- [Bart Kiers](https://github.com/bkiers), [Florian Simon](https://github.com/vermluh), [Henry Stanley](https://github.com/henryaj), [Hun Jae Lee](https://github.com/hunjaelee), [Javier Cejudo](https://github.com/javiercejudo), [Peter Etelej](https://github.com/etelej), [Ben Abbott](https://github.com/jaminscript), [Ray Nicholus](https://github.com/rnicholus), [Erin Grand](https://github.com/eringrand), [Léo Colombaro](https://github.com/LeoColomb), [Dean Attali](https://github.com/daattali), [Clayton Errington](https://github.com/cjerrington), [Colton Fitzgerald](https://github.com/coltonfitzgerald), [Trace Mayer](https://github.com/sunnankar) - Thanks for your [fantastic contributions](https://github.com/barryclark/jekyll-now/commits/master) to the project! - -## Contributing - -Issues and Pull Requests are greatly appreciated. If you've never contributed to an open source project before I'm more than happy to walk you through how to create a pull request. - -You can start by [opening an issue](https://github.com/barryclark/jekyll-now/issues/new) describing the problem that you're looking to resolve and we'll go from there. - -I want to keep Jekyll Now as minimal as possible. Every line of code should be one that's useful to 90% of the people using it. Please bear that in mind when submitting feature requests. If it's not something that most people will use, it probably won't get merged. :guardsman: +The original Jekyll Now license is retained in `LICENSE`. diff --git a/_config.yml b/_config.yml index 51f95379a729e..427608b091b98 100644 --- a/_config.yml +++ b/_config.yml @@ -6,7 +6,7 @@ name: Michael Neeley # Short bio or description (displayed in the header) -description: Web Developer from Somewhere +description: Software engineer · Greenville, SC # URL of your avatar or profile pic (you could use your GitHub profile pic) avatar: https://raw.githubusercontent.com/barryclark/jekyll-now/master/images/jekyll-logo.png @@ -91,7 +91,7 @@ collections: defaults: - scope: - path: "" - type: "connecttech2018" - values: - layout: "post" + path: "" + type: "connecttech2018" + values: + layout: "post" diff --git a/assets/animal-mania.webp b/assets/animal-mania.webp new file mode 100644 index 0000000000000..382a99874a107 Binary files /dev/null and b/assets/animal-mania.webp differ diff --git a/assets/favicon.svg b/assets/favicon.svg new file mode 100644 index 0000000000000..da0b53fd399db --- /dev/null +++ b/assets/favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/index.html b/index.html index 5e0cb3ee5773d..4bd27162f3727 100644 --- a/index.html +++ b/index.html @@ -1,18 +1,110 @@ ---- -layout: default ---- + + + + + + Michael Neeley — Software Engineer + + + + + + + + + + + + +
+ -
- {% for post in site.posts %} -
+
+
+

Software engineer · Greenville, SC

+

Useful software.
Less ceremony.

+

I’m Michael. I build developer tools, web apps, and the occasional game. Here’s a small collection of what I’m working on in the open.

+ Explore the projects +
-

{{ post.title }}

+
+
+

Selected projects / 02

+

Public code. Active work.

+
+
+
+ +
+

01 / Developer tooling

+

Lamplight

+

Issues in. Pull requests out. A small GitHub + pi runner that turns an issue queue into isolated coding-agent runs.

+

Sequential execution. Draft PRs. Zero runtime npm dependencies.

+
    +
  • JavaScript
  • Node.js
  • GitHub CLI
  • +
+ +
+
-
- {{ post.excerpt }} -
+
+
+ Animal Mania gameplay: a tiger faces a gorilla in a pixel-art jungle arena. +
+
+

02 / Browser game

+

Animal Mania

+

An 8-bit-style tactical animal battler. Play against the CPU, share a screen, or challenge a friend in a private online room.

+

Server-authoritative turns. Redis-backed rooms. Data-driven fighters.

+
    +
  • JavaScript
  • WebSockets
  • Redis
  • +
+ +
+
+
+ More on GitHub +
- Read More -
- {% endfor %} -
\ No newline at end of file +
+
+

Keep in touch

+

Good software starts
with a conversation.

+
+ michael@neeley.dev +
+ + + +
+ + diff --git a/portfolio.css b/portfolio.css new file mode 100644 index 0000000000000..86c9c855951e2 --- /dev/null +++ b/portfolio.css @@ -0,0 +1,106 @@ +:root { + color-scheme: dark; + --bg: #111412; + --surface: #181c19; + --line: #343d35; + --text: #edf0e9; + --muted: #a2aca2; + --accent: #c5e6a0; + --mono: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; + background: var(--bg); + color: var(--text); +} + +* { box-sizing: border-box; } +body { margin: 0; line-height: 1.6; } +a { color: inherit; text-underline-offset: 0.25em; } +a:hover { color: var(--accent); } +a:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; } +::selection { background: var(--accent); color: var(--bg); } +h1, h2, h3, p { margin: 0; } +.shell { max-width: 1136px; margin: auto; padding: 0 40px; } +.site-header, .identity, nav, .section-header, .project-links, .site-footer, .site-footer div { + display: flex; + align-items: center; +} +.site-header { justify-content: space-between; gap: 24px; min-height: 112px; border-bottom: 1px solid var(--line); } +.identity { gap: 14px; font-weight: 600; text-decoration: none; letter-spacing: -0.02em; } +.monogram { color: var(--accent); font: 700 21px var(--mono); } +nav { gap: 28px; } +nav a, .site-footer a { text-decoration: none; } +nav a { font-size: 14px; padding: 10px 0; } +.intro { padding: 88px 0 80px; } +.eyebrow { font: 12px/1.6 var(--mono); color: var(--muted); letter-spacing: 0.04em; } +.intro .eyebrow { display: flex; align-items: center; gap: 10px; } +.marker { width: 7px; height: 7px; background: var(--accent); } +h1 { margin: 24px 0; font-size: clamp(44px, 6.8vw, 80px); font-weight: 600; line-height: 1.05; letter-spacing: -0.055em; } +h1 span { color: var(--accent); } +.intro-copy { max-width: 565px; font-size: 19px; line-height: 1.65; color: var(--muted); } +.text-link { display: inline-flex; align-items: center; gap: 16px; font-size: 14px; font-weight: 500; text-decoration: none; border-bottom: 1px solid var(--line); padding: 10px 0; } +.intro .text-link { margin-top: 23px; } +.text-link span { color: var(--accent); } +.work { scroll-margin-top: 24px; } +.section-header { justify-content: space-between; gap: 16px; border-top: 1px solid var(--line); padding: 26px 0; } +.section-header h2 { font-size: 16px; font-weight: 500; } +.count { margin-left: 9px; color: var(--muted); font: 12px var(--mono); } +.section-header p { font: 12px var(--mono); color: var(--muted); } +.project-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; } +.project { display: flex; flex-direction: column; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; overflow: hidden; } +.project-preview { aspect-ratio: 1.9; min-height: 240px; overflow: hidden; border-bottom: 1px solid var(--line); } +.terminal { background: #101713; font-family: var(--mono); } +.terminal-bar { display: flex; gap: 24px; align-items: center; padding: 12px 20px; border-bottom: 1px solid #29352b; font-size: 10px; color: var(--muted); } +.terminal-dots { color: #647660; letter-spacing: 3px; } +.terminal-body { padding: 20px 28px; font-size: 12px; } +.command { margin-bottom: 16px; font-size: 14px; } +.command span { color: var(--accent); margin-right: 8px; } +.workflow { list-style: none; padding: 0; margin: 0; line-height: 2; color: #c9d4c9; } +.workflow li span { color: #849682; margin-right: 16px; } +.workflow b { color: var(--accent); font-weight: 400; } +.game-preview { background: #061924; } +.game-preview img { display: block; width: 100%; height: 100%; object-fit: cover; object-position: top; } +.project-body { display: flex; flex: 1; flex-direction: column; padding: 27px; } +.project h3 { margin: 8px 0 12px; font-size: 28px; font-weight: 500; line-height: 1.2; letter-spacing: -0.035em; } +.project h3 a { display: flex; justify-content: space-between; align-items: center; gap: 16px; text-decoration: none; } +.project h3 span { color: var(--muted); font-size: 22px; } +.project-body > p:not(.eyebrow) { color: var(--muted); font-size: 15px; } +.project-body > .technical-note { margin-top: 15px; } +.tags { display: flex; flex-wrap: wrap; gap: 8px; padding: 0; margin: 22px 0 28px; list-style: none; } +.tags li { border: 1px solid var(--line); border-radius: 4px; padding: 3px 8px; color: #c7d1c5; font: 11px/1.5 var(--mono); } +.project-links { flex-wrap: wrap; gap: 24px; margin-top: auto; } +.project-links a { font-size: 13px; text-decoration: none; padding: 8px 0; } +.project-links span[aria-hidden] { color: var(--accent); margin-left: 5px; } +.all-projects { margin-top: 24px; } +.contact { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: 32px; margin-top: 72px; padding: 48px 0; border-top: 1px solid var(--line); } +.contact h2 { margin-top: 12px; font-size: clamp(25px, 3vw, 34px); font-weight: 500; line-height: 1.25; letter-spacing: -0.035em; } +.contact .text-link { color: var(--accent); } +.site-footer { justify-content: space-between; flex-wrap: wrap; gap: 16px; border-top: 1px solid var(--line); padding: 25px 0 32px; color: var(--muted); font: 11px/1.7 var(--mono); } +.site-footer div { flex-wrap: wrap; gap: 24px; } +.site-footer a { padding: 8px 0; } +.skip-link { position: absolute; top: -100px; left: 16px; padding: 12px; background: var(--accent); color: var(--bg); z-index: 1; } +.skip-link:focus { top: 16px; color: var(--bg); } +.sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; } + +@media (max-width: 760px) { + .shell { padding: 0 24px; } + .site-header { min-height: 100px; } + .identity { font-size: 14px; gap: 9px; } + nav { gap: 16px; } + nav a { font-size: 12px; } + .intro { padding: 64px 0; } + .intro-copy { font-size: 17px; } + .project-grid { grid-template-columns: 1fr; } + .terminal-body { padding: 24px 28px; } + .contact { margin-top: 48px; } +} + +@media (max-width: 420px) { + .shell { padding: 0 20px; } + .site-header { align-items: flex-start; justify-content: center; flex-direction: column; gap: 4px; padding: 20px 0 12px; } + nav { gap: 24px; } + .intro .eyebrow { font-size: 10px; } + .section-header { align-items: flex-start; flex-direction: column; gap: 4px; } + .project-preview { aspect-ratio: 1.5; } + .terminal-body { padding: 18px 20px; font-size: 11px; } + .project-body { padding: 24px; } +}