{"id":37316808,"url":"https://github.com/stevemckinney/iamsteve","last_synced_at":"2026-04-25T07:02:39.288Z","repository":{"id":3932723,"uuid":"5023277","full_name":"stevemckinney/iamsteve","owner":"stevemckinney","description":"Design and code blog built with Next.js ","archived":false,"fork":false,"pushed_at":"2026-04-21T06:00:12.000Z","size":151311,"stargazers_count":21,"open_issues_count":17,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-21T07:37:16.981Z","etag":null,"topics":["css","design","ui"],"latest_commit_sha":null,"homepage":"https://iamsteve.me","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"nicoSWD/put.io-adder","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stevemckinney.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2012-07-13T18:24:41.000Z","updated_at":"2026-04-21T05:58:34.000Z","dependencies_parsed_at":"2023-07-05T21:33:03.997Z","dependency_job_id":"892ff2f3-6246-4917-bfa9-8724761dcff7","html_url":"https://github.com/stevemckinney/iamsteve","commit_stats":null,"previous_names":[],"tags_count":134,"template":false,"template_full_name":null,"purl":"pkg:github/stevemckinney/iamsteve","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevemckinney%2Fiamsteve","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevemckinney%2Fiamsteve/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevemckinney%2Fiamsteve/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevemckinney%2Fiamsteve/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stevemckinney","download_url":"https://codeload.github.com/stevemckinney/iamsteve/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevemckinney%2Fiamsteve/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32253252,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T04:23:17.126Z","status":"ssl_error","status_checked_at":"2026-04-25T04:21:53.360Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["css","design","ui"],"created_at":"2026-01-16T03:11:32.782Z","updated_at":"2026-04-25T07:02:39.268Z","avatar_url":"https://github.com/stevemckinney.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![iamsteve.me banner](/app/opengraph-image.png)\n\n# iamsteve.me design \u0026 code blog\n\nA design and code blog using Next.js with App Router.\n\n## Quick start\n\n\u003cdetails\u003e\n\u003csummary\u003eDevelopment setup\u003c/summary\u003e\n\nFirst, run the development server:\n\n```bash\npnpm build\n# or\npnpm dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) with your browser to see the result.\n\n\u003c/details\u003e\n\n## Creating posts\n\n\u003cdetails\u003e\n\u003csummary\u003eHow to create and manage blog posts\u003c/summary\u003e\n\n### Starting a new post\n\n1. Create a new branch:\n\n```bash\ngit checkout -b post/your-post-name\n```\n\n2. Generate the post:\n\n```bash\nnode ./scripts/compose.js\n```\n\n3. Follow the prompts for:\n   - Post title\n   - File extension (md or mdx)\n   - Post status (open, draft, closed)\n\n### Post structure\n\nPosts can be created in two formats:\n\n1. Single file:\n\n```\ncontent/blog/0177-your-post-title.mdx\n```\n\n2. Directory with index file (for posts with assets):\n\n```\ncontent/blog/0177-your-post-title/\n  ├─ index.mdx\n  ├─ image.png\n  └─ other-assets/\n```\n\n### Post id system\n\n- IDs are automatically managed:\n  - `compose.js` scans existing posts to assign the next available ID\n  - GitHub Actions handle ID conflicts during pull requests\n  - Pre-merge-commit hook ensures ID uniqueness when merging\n\n### Publishing workflow\n\n1. Create your post on a new branch\n2. Make your changes and commit\n3. Create a pull request\n4. The system will automatically:\n   - Check for ID conflicts\n   - Update IDs if needed\n   - Handle merging safely\n   \u003c/details\u003e\n\n## Post configuration\n\n\u003cdetails\u003e\n\u003csummary\u003eFrontmatter and image requirements\u003c/summary\u003e\n\nExample frontmatter:\n\n```yaml\n---\ntitle: 'Visual design tips you can apply immediately'\ndate: '2017-07-04T11:51:00+00:00'\nlastmod: '2019-10-04T07:24:49+00:00'\nsummary: 'Add a little extra polish to any of your designs with these tips.'\nmetadesc: 'When designing there are things you can rely upon regardless of the situation.'\ntheme: '#fff7e0'\ntags: ['Design']\ncategories: ['Design']\nimages: ['/images/blog/visual-design-tips-featured-image.png']\nlarge: '/images/blog/visual-design-tips-featured-image.png'\nmedium: '/images/blog/visual-design-tips-featured-image-medium.png'\nogImage: '/opengraph-image.png'\nstatus: 'open'\nid: 164\nfileroot: 'visual-design-tips-you-can-apply-immediately'\n---\n```\n\n### Field descriptions\n\n- `large`: Main image (592x368 SVG)\n- `medium`: Medium image (384x240 SVG)\n- `ogImage`: Custom post opengraph image (optional)\n- `status`: Post status (open, draft, closed)\n- `id`: Unique post identifier (managed automatically)\n- `fileroot`: Slug used for image naming\n- `images`: Legacy field (not in use)\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eCollections\u003c/summary\u003e\nThe collections script helps manage design and development resource links. It supports both individual entries and bulk imports.\n\n### Adding individual collections\n\nRun the script without arguments for interactive mode:\n\n```bash\nnode scripts/compose-collection.js\n```\n\nYou'll be prompted for:\n\n- Title: Name of the resource\n- URL: Web address\n- Collection: Category (e.g., Inspiration, Typography, UX Design)\n- Kind: Type of resource (website, article, resource, or tool)\n- Extension: File format (md or mdx)\n\nExample output:\n\n```bash\nTitle: Awesome Design System\nURL: https://design-system-example.com\nCollection: Inspiration\nKind: website\nExtension: md\nCollection item generated successfully at content/collections/design-system-example.md\nUpdated .last-collection-import to 2025-12-06\n```\n\n### Bulk import\n\nTo import multiple items, create a JSON file with your collections and pass it to the script:\n\n```bash\nnode scripts/compose-collection.js bookmarks.json\n```\n\nJSON file structure:\n\n```json\n[\n  {\n    \"title\": \"Example Site\",\n    \"url\": \"https://example.com\",\n    \"collection\": \"Inspiration\",\n    \"kind\": \"website\",\n    \"extension\": \"md\"\n  }\n]\n```\n\nExample output:\n\n```bash\nCreated: example\nCreated: another-example\n\nUpdated .last-collection-import to 2025-12-06\n\nImport complete: 2 items processed\n```\n\n#### Fields:\n\n- `title`: Resource name (required)\n- `url`: Web address (required)\n- `collection`: Category name (required) - case-insensitive, automatically normalized (e.g., \"inspiration\", \"Foundry\", \"UX design\", \"ux-design\" all work)\n- `kind`: Type of resource (optional, defaults to 'website')\n  - Options: website, article, resource, tool\n- `extension`: File format (optional, defaults to 'md')\n  - Options: md, mdx\n\n#### Available collections:\n\nThe script automatically normalizes collection names, so you can use any casing:\n\n- **Accessibility** - accessibility standards and guidelines\n- **CSS** - CSS resources and tools\n- **Code** - code tools and libraries\n- **Colour** (or Color) - color theory and tools\n- **Content** - content strategy resources\n- **Favourites** (or Favorites) - personal favorites\n- **Foundry** - type foundries (foundry)\n- **Inspiration** - design inspiration galleries (inspiration, etc.)\n- **Motion** - motion design resources\n- **Publication** - design publications\n- **Resource** - general design resources\n- **Typography** - typography resources that aren't foundries (typography, etc.)\n- **UX design** - UX/UI design resources (ux design, ux-design, uxdesign all work)\n\nThe script automatically:\n\n- Generates unique filenames from URLs\n- Prevents duplicate entries\n- Creates properly formatted markdown files with quoted titles\n- Adds timestamps\n- Updates `.last-collection-import` tracking file\n\n### \"New\" badge behavior\n\nCollection items display a \"New\" badge based on:\n\n- Items added after the last import date (tracked in `.last-collection-import`)\n- OR items added within the last 3 months (whichever is more recent)\n- The badge automatically disappears on the next import or after 3 months\n\nThis ensures newly imported items are highlighted until you perform another import or they become older than 3 months.\n\n\u003c/details\u003e\n\n## Releases and versioning\n\n\u003cdetails\u003e\n\u003csummary\u003eHow releases are created automatically\u003c/summary\u003e\n\n### How it works\n\nWhen a PR is merged to `main`, the release action automatically:\n\n1. Finds the latest git tag (e.g. `v9.0.0`)\n2. Checks if there are meaningful changes since that tag\n3. Determines the version bump type from commit messages\n4. Tags the merge commit directly (no extra commit pushed to `main`)\n5. Creates a GitHub release with grouped release notes\n\nThis means **one merge = one Vercel build**, not two.\n\n### Version bump rules\n\n**Patch** (automatic \u0026mdash; the default, e.g. `v9.0.0` \u0026rarr; `v9.0.1`):\nMost merges create a patch release. Bug fixes, content updates, design tweaks, and chores all fall into this category.\n\n**Minor** (automatic for features, e.g. `v9.0.0` \u0026rarr; `v9.1.0`):\nTriggered when commit messages or branch names include `feat:`, `feat/`, or `feature/`:\n\n```\nfeat: add search to blog\nfeat(collections): filter by tag\n```\n\nOr use a branch name like `feat/search` or `feature/dark-mode`.\n\n**Major** (manual only, e.g. `v9.0.0` \u0026rarr; `v10.0.0`):\nMajor versions are reserved for significant milestones like a full redesign or framework migration. To create one, trigger the release workflow manually from the Actions tab and select \"major\" as the bump type.\n\n### Release note categories\n\nRelease notes are grouped by PR labels (configured in `.github/release.yml`):\n\n- **New features** \u0026mdash; `feature`, `enhancement`\n- **Bug fixes** \u0026mdash; `bug`, `fix`\n- **Design** \u0026mdash; `design`\n- **Content** \u0026mdash; `content`\n- **Other changes** \u0026mdash; everything else\n\nPRs labelled `skip-changelog` and commits from `github-actions[bot]` are excluded.\n\n### Checking out a past version\n\nEvery release is tagged, so you can check out any version:\n\n```bash\ngit checkout v8.2.0\n```\n\n\u003c/details\u003e\n\n## Credits\n\n\u003cdetails\u003e\n\u003csummary\u003eAcknowledgements\u003c/summary\u003e\n\nThe codebase started from the excellent [tailwind-nextjs-starter-blog](https://github.com/timlrx/tailwind-nextjs-starter-blog) and has since evolved from that.\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevemckinney%2Fiamsteve","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstevemckinney%2Fiamsteve","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevemckinney%2Fiamsteve/lists"}