{"id":24333672,"url":"https://github.com/fulldecent/blog.phor.net","last_synced_at":"2025-09-27T20:31:47.142Z","repository":{"id":147413023,"uuid":"452451465","full_name":"fulldecent/blog.phor.net","owner":"fulldecent","description":"William Entriken Blog — Analysis of all","archived":false,"fork":false,"pushed_at":"2024-12-14T03:48:55.000Z","size":50010,"stargazers_count":1,"open_issues_count":5,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-14T22:01:51.821Z","etag":null,"topics":["blog"],"latest_commit_sha":null,"homepage":"https://blog.phor.net","language":"CSS","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fulldecent.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"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},"funding":{"github":"fulldecent","custom":["http://www.amazon.com/gp/registry/EE78A23EEGQB"]}},"created_at":"2022-01-26T21:47:09.000Z","updated_at":"2025-01-07T17:21:04.000Z","dependencies_parsed_at":null,"dependency_job_id":"4809f692-9cc1-4086-baca-a491d0b47dac","html_url":"https://github.com/fulldecent/blog.phor.net","commit_stats":{"total_commits":100,"total_committers":1,"mean_commits":100.0,"dds":0.0,"last_synced_commit":"aa9a5ee1a3ba01e8598dce5880a68e06ec824bfc"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fulldecent%2Fblog.phor.net","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fulldecent%2Fblog.phor.net/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fulldecent%2Fblog.phor.net/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fulldecent%2Fblog.phor.net/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fulldecent","download_url":"https://codeload.github.com/fulldecent/blog.phor.net/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":234460512,"owners_count":18836837,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["blog"],"created_at":"2025-01-18T03:28:59.631Z","updated_at":"2025-09-27T20:31:47.136Z","avatar_url":"https://github.com/fulldecent.png","language":"CSS","funding_links":["https://github.com/sponsors/fulldecent","http://www.amazon.com/gp/registry/EE78A23EEGQB"],"categories":[],"sub_categories":[],"readme":"# blog.phor.net\n\nHow to add posts and maintain this site.\n\n## Add a post\n\n1. Copy from `_drafts/YYYY-MM-DD-TITLE.md` to `_posts`\n2. Add the publish date\n3. Add the URL slug, following [instructions for URL slugs](#url-slugs)\n\nThis adds the required and optional front matter, with notes on how to use them.\n\n## URL slugs\n\n*We need URLs that will be permanent, even with anticipated changes to the article.*\n\nName every post like: `_posts/2006-05-24-accepted-into-google-soc.md`.\n\nThis will publish to: \u003chttps://blog.phor.net/accepted-into-google-soc.md\u003e and the RSS feed will sort it, and permalink it, based on that date.\n\nHow to choose good URLs that will be permanent?\n\n* If a title is like \"Best TVs of 2023\" then be careful to choose a URL like `/best-tvs` because the list could be updated later and we want to keep the same URL.\n\n(Maybe?) If you want to bump a page to the top of the RSS feed for a major change (like switching the title from \"best TVs of 2023\" to \"best TVs of 2024\") then change the date in the filename (not the slug). And then you would have to rename all image files related to this post (maybe rename not needed? See below)\n\n## Asides\n\nArticle text usually displays in the left two-thirds of the page.\n\nUse the right third for some side notes like this:\n\n```markdown\n{: .margin-note}\nSome margin note paragraph text\n```\n\nThis syntax is explained at \u003chttps://kramdown.gettalong.org/quickref.html\u003e\n\n## Article images\n\nFor raster images hard limit is 1600 px max size for high detail. For editorial, use max 800 px.\n\n1. Make a featured image with the same basename as the post and put it in `/assets/images`. Include it like:\n\n   ```markdown\n   ![Fair random immediate decentralized](/assets/images/2022-02-04-randomization-strategies-for-nft-drops.svg)\n   ```\n\n2. For other images, name sequentiall, with suffixes or a folder:\n\n   ```markdown\n   ![Fair random immediate decentralized](/assets/images/2022-02-04-randomization-strategies-for-nft-drops-2.svg)\n   ![Fair random immediate decentralized](/assets/images/2022-02-04-randomization-strategies-for-nft-drops-some-feature.svg)\n   ![Fair random immediate decentralized](/assets/images/2022-02-04-randomization-strategies-for-nft-drops/some-feature.svg)\n   ```\n\nHere is how to convert one image to webp format, with a maximum width of 800 pixels:\n\n```sh\nconvert_to_webp() {\n    local input_file=\"$1\"\n    local max_width=1600\n    local output_file=\"${input_file%.*}.webp\"\n\n    if ! [ -f \"$input_file\" ]; then\n        echo \"Error: File '$input_file' not found.\"\n        return 1\n    fi\n\n    local width\n    width=$(identify -format \"%w\" \"$input_file\") || {\n        echo \"Error: Failed to get image width for '$input_file'\"\n        return 1\n    }\n\n    if [ \"$width\" -gt \"$max_width\" ]; then\n        cwebp -q 80 -m 6 -mt -v -resize \"$max_width\" 0 -o \"$output_file\" \"$input_file\"\n    else\n        cwebp -q 80 -m 6 -mt -v -o \"$output_file\" \"$input_file\"\n    fi\n\n    echo \"✅ Converted: $input_file → $output_file\"\n}\n\n# Example usage\nconvert_to_webp \"input.png\"\n  ```\n\n## Style guide\n\nWord case:\n\n* Use uppercase letters just at the start of sentences, and for proper nouns and initialisms.\n\nFormatting a chat conversation (Full Decent is always the red one):\n\n* Preserve typos\n\n* Format color like this\n\n  ```md\n  \u003e \u003cspan style=\"color:blue\"\u003eSteven Shim:\u003c/span\u003e ok the riddle ... it's not possible, because 8x + 6y = 5 does not have a solution where you can use integers, so there is no way to get 3 or 1 gallons from the mix.... otherwise you'd be able to get 5 gallons. is this right?\u003cbr /\u003e\n  \u003e \u003cspan style=\"color:red\"\u003eFull Decent:\u003c/span\u003e xml asap!!!\u003cbr /\u003e\n  \u003e \u003cspan style=\"color:blue\"\u003eSteven Shim:\u003c/span\u003e because the lowest common denominator is 1\n  ```\n\nProse:\n\n* Do not use Oxford comma.\n* Citing US court cases: Bluebook style, e.g. United States v. Google, No. 20-cv-3010 (APM) (D.D.C. Aug. 5, 2024).\n\n## Discussion of best practices\n\n* Jekyll [does not have a good, built-in way of directly associating images to posts](https://github.com/jekyll/jekyll/issues/7681) (i.e. putting them in the `_posts` folder). Other people have thoughtful discussions and prescriptions about this problem:\n\n  * \u003chttps://www.miguoliang.com/effective-jekyll-content-management-image-assets-in-posts.html\u003e\n\n  * \u003chttps://billraymond.github.io/jekyll-featured-images/\u003e\n\n* The Verge has a thoughtful approach to URL/slug choice. Examples: [1](https://www.theverge.com/22727963/roku-streaming-stick-4k-review), [2](https://www.theverge.com/21375098/best-streaming-device), [3](https://www.theverge.com/2023/1/4/23537503/roku-select-plus-tvs-features-price), [4](https://www.theverge.com/2023/11/15/23961754/sharp-aquos-oled-roku-tv-size-price).\n\n## Tools\n\nSee scripts/ folder for some cool tools. Requerements for the tools are documented in those files.\n\n* ```sh\n  scripts/rename-post.sh YYYY-MM-DD-old-title.md YYYY-MM-DD-new-title.md\n  ```\n\n* Use `yq` to change title.\n\n## Tags\n\nTags should use slug formatting, don't mash words.\n\nHere is how to batch edit a tag:\n\n```sh\nfind _posts -type f -name \"*.md\" -exec yq e -i -I 2 --front-matter=process '.tags |= map(select(. == \"mylife\") = \"my-life\")' {} \\;\n```\n\n## How to promote a post\n\nAfter publishing a post, you can promote it by:\n\n* Tweet it\n* Post it to Hacker News (\u003chttps://news.ycombinator.com/\u003e)\n* Post it to Reddit (\u003chttps://www.reddit.com/r/programming/\u003e)\n* Post it to Lobsters (\u003chttps://lobste.rs/\u003e)\n* My press contacts\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffulldecent%2Fblog.phor.net","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffulldecent%2Fblog.phor.net","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffulldecent%2Fblog.phor.net/lists"}