[{"content":"Blog about web development and other random things.\n","date":null,"permalink":"https://markok.dev/blog/","section":"Blog","summary":"","title":"Blog"},{"content":"","date":null,"permalink":"https://markok.dev/categories/","section":"Categories","summary":"","title":"Categories"},{"content":"","date":null,"permalink":"https://markok.dev/tags/human.json/","section":"Tags","summary":"","title":"Human.json"},{"content":"I have written about the human.json standard and AI in this blog and added it to this Hugo site. Now I built a WordPress plugin that allows you to add human.json to WordPress — Human.json for Humans.\nThe plugin is open source and available on Codeberg: https://codeberg.org/markokaa/human-json-for-humans\nWhat it does #Once installed, the plugin automatically serves human.json file at yourdomain.com/human.json and adds a \u0026lt;link rel=\u0026quot;human-json\u0026quot;\u0026gt; tag to every page\u0026rsquo;s \u0026lt;head\u0026gt; so others can find your file automatically.\nFrom Settings → Human.json you can manage your site URL and vouched sites. You can also import vouched sites from any other human.json file — duplicates are skipped automatically.\nTo display your vouched sites on any page or post, you can use the included Gutenberg block or use shortcode to show it on any page or post.\nA note on AI #Different AI models were used as a development aid — for asking questions, debugging, handling repetitive tasks, and sparring on ideas. Some code was written or suggested by AI, but everything has been reviewed, tested, and possibly rewritten by human.\nAI also helped with English wording and translations, as English is not my native language.\nAI is treated as a tool, not a replacement for developer judgment. This is not a vibe-coded project.\nGet the plugin #The plugin is in its early stages (version 0.1.0) and not yet in the official WordPress plugin directory. For now, you can download it from Codeberg and install it manually. It is under reveiw for the official WordPress plugin directory.\nYou can download zip from Codeberg releases:\nhttps://codeberg.org/markokaa/human-json-for-humans\nIf you try it out, I would love to hear what you think. And also you are free to submit issues or even make a pull request.\n","date":"Fri 10 April 2026","permalink":"https://markok.dev/blog/2026/human.json-for-humans-wordpress-plugin/","section":"Blog","summary":"I built an open-source WordPress plugin that implements the human.json standard. It serves your human.json file, adds a discovery tag to every page, and lets you manage vouched sites with a Gutenberg block or shortcode.","title":"Human.json for Humans WordPress Plugin"},{"content":"","date":null,"permalink":"https://markok.dev/tags/open-source/","section":"Tags","summary":"","title":"Open Source"},{"content":"","date":null,"permalink":"https://markok.dev/tags/plugin/","section":"Tags","summary":"","title":"Plugin"},{"content":"","date":null,"permalink":"https://markok.dev/tags/","section":"Tags","summary":"","title":"Tags"},{"content":" Welcome to my small piece of Internet. Here we have something about Internet, games, web development and all the other stuff.. ","date":null,"permalink":"https://markok.dev/","section":"Welcome to my blog 🤓","summary":"","title":"Welcome to my blog 🤓"},{"content":"","date":null,"permalink":"https://markok.dev/categories/wordpress/","section":"Categories","summary":"","title":"WordPress"},{"content":"","date":null,"permalink":"https://markok.dev/tags/wordpress/","section":"Tags","summary":"","title":"WordPress"},{"content":"","date":null,"permalink":"https://markok.dev/categories/ai/","section":"Categories","summary":"","title":"AI"},{"content":"","date":null,"permalink":"https://markok.dev/tags/ai/","section":"Tags","summary":"","title":"AI"},{"content":"","date":null,"permalink":"https://markok.dev/tags/blog/","section":"Tags","summary":"","title":"Blog"},{"content":"","date":null,"permalink":"https://markok.dev/tags/blogging/","section":"Tags","summary":"","title":"Blogging"},{"content":"","date":null,"permalink":"https://markok.dev/tags/claude/","section":"Tags","summary":"","title":"Claude"},{"content":"","date":null,"permalink":"https://markok.dev/tags/coding/","section":"Tags","summary":"","title":"Coding"},{"content":" I\u0026rsquo;ll share a bit about how I currently use AI. I\u0026rsquo;ll go through how I use it in my own projects (like this blog) and elsewhere. Expect the usual mixed bag of thoughts. AI has really made its way into everyday life over the past year — it\u0026rsquo;s everywhere and people of all kinds are using it, from nerds to regular folks. Before you\u0026rsquo;d Google something and read a blog post, now you just ask AI directly. Handy, but at the same time those sites where the information actually comes from lose visitors and ad revenue — and that\u0026rsquo;s not a great thing.\nYou could write endlessly about this topic, but let\u0026rsquo;s get to the point: I\u0026rsquo;m not exactly a power user, but I do use AI to some extent. Here\u0026rsquo;s a bit about how.\nHow I use AI #I pay for a Claude Pro subscription and it\u0026rsquo;s served me just fine so far. That probably also says something about how much I actually use it, if I haven\u0026rsquo;t needed to go for a more expensive plan. Let me go through some examples of how I use AI — that\u0026rsquo;s probably the clearest way to explain it.\nAsking AI things #This is probably the most common use — just asking questions. A lot of people do this. I might ask AI things the same way I used to Google stuff. No need to think too carefully about search terms, I can just ask in my own way. Often I\u0026rsquo;ll then ask for sources and go check out the actual pages myself. And from there maybe back to good old Google.\nAI experiments #Got to experiment with AI a bit and see how it works. I\u0026rsquo;ve asked AI to generate silly images and had it add something funny to a photo. These I\u0026rsquo;ve mostly shared with friends rather than publicly.\nOne coding-related experiment was building an MCP server for SpottiHinta. This was mainly just for fun — so you can ask AI about the current spot price and it gives you the actual price by fetching it from the MCP server. I wrote about it in SpottiHinta\u0026rsquo;s announcements (in finnish).\nI also briefly tried the hyped OpenClaw, but I didn\u0026rsquo;t want to go down that path yet and give it broader access to anything. You see a lot of different implementations and what people manage to pull off, but it would require a bit more dedication and a willingness to throw money at various services.\nBlogging #I don\u0026rsquo;t write full articles with AI. I write them myself. I might brainstorm with AI about an article — like how it could be improved or if it has any thoughts. But even then I make my own edits if it seems like a good idea. I might ask AI for keywords related to an article.\nCoding #Might as well mention vibecoding first. The way I see it, that\u0026rsquo;s when you code an entire app purely with AI and don\u0026rsquo;t really do anything yourself. That\u0026rsquo;s pretty damn dangerous if you don\u0026rsquo;t actually know how to code and have no idea what building secure apps requires.\nI use AI as an assistant. It doesn\u0026rsquo;t code the whole thing — we work together. It\u0026rsquo;s an incredibly good helper for debugging and figuring out errors. I can throw an error message at it and it\u0026rsquo;ll dig into how it could be fixed.\nIt\u0026rsquo;s also great for what I\u0026rsquo;d call \u0026ldquo;monkey work\u0026rdquo;. By \u0026ldquo;monkey work\u0026rdquo; I mean repetitive, simple stuff — like find all untranslated strings in the code and replace them with translation keys. I actually used it for exactly that when working on translations for Tapaaminen.net.\nVarious tools and bash scripts are also easy to make with AI. Since bash scripting isn\u0026rsquo;t really my strong suit, it makes Linux a lot easier to use when I can just ask how to do something and get quite ready-to-use code. I usually read through it and tweak it a bit, but it\u0026rsquo;s a huge help.\nI\u0026rsquo;ve also asked how a certain feature could be implemented, or just bounced ideas around. It\u0026rsquo;s almost like talking to another person, except I can ask stupid questions without worrying 😆\nI\u0026rsquo;ve also had it build forms since those damn things can be annoying to put together. So I use AI for assistance and for helping with the annoying stuff. I do still enjoy coding and solving problems that way. The backend is probably my place to be and you can tell that from the frontends on my projects.\nClosing thoughts #I added a general AI page here on the blog where I explain AI usage at a high level. I\u0026rsquo;ll try to keep publishing stuff in the AI category going forward, so feel free to browse there for more.\nOn that AI page there\u0026rsquo;s also a mention of the human.json system, which I\u0026rsquo;ve also set up. It\u0026rsquo;s a signal that there\u0026rsquo;s a human behind the content, not AI.\nAI is going to become more widespread in the future and it\u0026rsquo;ll probably make its way further into my own workflow somehow. I don\u0026rsquo;t quite know yet how or in what way. There might be things I currently do myself that I\u0026rsquo;ll hand off to AI — especially if something is tedious and repetitive.\nBottom line — AI is an assistant, not a replacement. At least not yet.\nHow do you use AI?\nThis article was first published on my blog in Finnish. Article image by Ant Rozetsky on Unsplash\n","date":"Fri 10 April 2026","permalink":"https://markok.dev/blog/2026/how-i-use-ai/","section":"Blog","summary":"I\u0026rsquo;ll share a bit about how I currently use AI. I\u0026rsquo;ll go through how I use it in my own projects (like this blog) and elsewhere.","title":"How I Use AI"},{"content":"","date":null,"permalink":"https://markok.dev/tags/openclaw/","section":"Tags","summary":"","title":"OpenClaw"},{"content":"","date":null,"permalink":"https://markok.dev/tags/spottihinta/","section":"Tags","summary":"","title":"SpottiHinta"},{"content":"","date":null,"permalink":"https://markok.dev/tags/vibecoding/","section":"Tags","summary":"","title":"Vibecoding"},{"content":"Here are some interesting links, at least for me.\n","date":null,"permalink":"https://markok.dev/links/","section":"Links","summary":"","title":"Links"},{"content":"","date":"Sun 29 March 2026","permalink":"","section":"Links","summary":"human.json is a lightweight protocol for humans to assert authorship of their site content and vouch for the humanity of others. It uses URL ownership as identity, and trust propagates through a crawlable web of vouches between sites.","title":"The Human.json Protocol"},{"content":" Hugo is fast and great static site generator. This blog is built with Hugo. In this article, I\u0026rsquo;ll show how I deploy my Hugo site to a Linux server using GitHub Actions. I use this method on this site and also on my finnish BBQ blog.\nWhat is behind the scene? #Here we have a Hugo site in a GitHub repository. That is a base of the whole operation. I have Ubuntu web server with Nginx installed. The server is running on a Hetzner VPS.\nI use GitHub Actions to automate the deployment process. When I push changes to the repository, GitHub Actions triggers a workflow that builds the Hugo site and deploys it to the server. The deployment script uses SSH to connect to the server and copy the built site files to the web server directory.\nSet up SSH keys #The deployment uses SSH to securely transfer files to your server. First, generate an SSH key pair. You can do it on your local machine or on the server.\nssh-keygen -t rsa -b 4096 -C \u0026#34;github-actions@domain.dev\u0026#34; -f ~/.ssh/gh_domaindev_action Add the public key to your server\u0026rsquo;s ~/.ssh/authorized_keys file, and keep the private key for the next step.\nConfiguring GitHub Secrets #In your GitHub repository, go to Settings → Secrets and variables → Actions and add the following repository secrets:\nSecret Description DEPLOY_KEY Your SSH private key DEPLOY_HOST Your server\u0026rsquo;s IP address or hostname DEPLOY_USER The SSH username on your server DEPLOY_PATH The path on the server where files will be deployed The GitHub Actions Workflow #Create the file .github/workflows/deploy.yml in your repository with the content below. You can customize the workflow as needed and for example change the Hugo version.\nname: Deploy Hugo site to Ubuntu server on: push: branches: - main jobs: deploy: name: Deploy to Ubuntu Server runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: hugo-version: \u0026#34;latest\u0026#34; - name: Build site run: hugo --minify - name: Setup SSH run: | mkdir -p ~/.ssh echo \u0026#34;${{ secrets.DEPLOY_KEY }}\u0026#34; \u0026gt; ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ secrets.DEPLOY_HOST }} \u0026gt;\u0026gt; ~/.ssh/known_hosts - name: Deploy to server run: | rsync -avz --delete \\ -e \u0026#34;ssh -i ~/.ssh/id_rsa\u0026#34; \\ public/ ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:${{ secrets.DEPLOY_PATH }} So how does it work? #The workflow runs automatically every time you push to the main branch. Here is what happens step by step:\nCheckout – The repository is cloned, including any Git submodules (e.g. themes). Setup Hugo – The latest version of Hugo is installed. Build – Hugo builds the site into the public/ directory with minification enabled. Setup SSH – The SSH private key is configured so the runner can connect to your server. Deploy – rsync transfers the built files to your server, removing any old files that no longer exist. Conclusion #With this method, you can easily deploy your Hugo site to a Linux server using GitHub Actions. If your GitHub repository is public, you can use Actions for free.\nIt is also possible to host Hugo sites on GitHub Pages, which is also a free option to host your site. You can read more about it in the Hugo documentation.\nAlso GitHub is not the only option, but it is widely popular and has a ton of free features.\nArticle image by Maik Winnecke on Unsplash\n","date":"Wed 4 March 2026","permalink":"https://markok.dev/blog/2026/deploying-hugo-site-to-a-linux-server/","section":"Blog","summary":"Hugo is fast and great static site generator. This blog is built with Hugo. In this article, I\u0026rsquo;ll show how I deploy my Hugo site to a Linux server using GitHub Actions.","title":"Deploying Hugo site to a Linux server"},{"content":"","date":null,"permalink":"https://markok.dev/tags/github/","section":"Tags","summary":"","title":"GitHub"},{"content":"","date":null,"permalink":"https://markok.dev/categories/hugo/","section":"Categories","summary":"","title":"Hugo"},{"content":"","date":null,"permalink":"https://markok.dev/tags/hugo/","section":"Tags","summary":"","title":"Hugo"},{"content":"","date":null,"permalink":"https://markok.dev/tags/linux/","section":"Tags","summary":"","title":"Linux"},{"content":"","date":null,"permalink":"https://markok.dev/tags/server/","section":"Tags","summary":"","title":"Server"},{"content":"","date":null,"permalink":"https://markok.dev/tags/configuration/","section":"Tags","summary":"","title":"Configuration"},{"content":" This is mostly a note to myself, but hopefully useful to others too. Here\u0026rsquo;s how to increase the post character limit on a Mastodon server. Bonus: how to increase the number of poll options as well. First, a disclaimer: these changes may be reset during an update, and you\u0026rsquo;ll have to redo them. That\u0026rsquo;s exactly why I\u0026rsquo;m writing this down for myself. This works at least in the latest versions!\nUnfortunately, neither of these settings are in the .env.production file — they need to be changed directly in the code. So if you\u0026rsquo;re not sure what you\u0026rsquo;re doing, don\u0026rsquo;t make these changes. I take no responsibility if you break something!\nIncreasing the character limit #This requires editing two files. You can use the nano editor for this. In nano, CTRL + O saves and CTRL + X closes the editor.\nSwitch to the mastodon user (sudo su - mastodon) and navigate to the /home/mastodon/live directory.\nFirst, edit the compose_form_container.js file:\nnano app/javascript/mastodon/features/compose/containers/compose_form_container.js Find the line where maxChars is defined and change the value to your desired character count. The default is 500.\nmaxChars: state.getIn([\u0026#39;server\u0026#39;, \u0026#39;server\u0026#39;, \u0026#39;configuration\u0026#39;, \u0026#39;statuses\u0026#39;, \u0026#39;max_characters\u0026#39;], 500), The second file to edit is status_length_validator.rb:\nnano app/validators/status_length_validator.rb Find the MAX_CHARS line and set it to the same value you used above. The default is 500.\nMAX_CHARS = 500 After that, you need to recompile the assets with the following command:\nRAILS_ENV=production bundle exec rails assets:precompile Then restart the Mastodon processes:\nsudo systemctl stop \u0026#39;mastodon-*.service\u0026#39; sudo systemctl start \u0026#39;mastodon-*.service\u0026#39; --all If everything went as expected, you should now see the new character limit when composing a post!\nBonus: Increasing the number of poll options #If you also want more than 4 options in polls, you can change that in the poll_options_validator.rb file:\nnano app/validators/poll_options_validator.rb Find the MAX_OPTIONS line and change it to your desired number of options. The default is 4.\nMAX_OPTIONS = 4 This article was first published on my blog in Finnish. Article image by Rolf van Root on Unsplash\n","date":"Wed 4 March 2026","permalink":"https://markok.dev/blog/2026/increasing-the-character-limit-on-a-mastodon-server/","section":"Blog","summary":"This is mostly a note to myself, but hopefully useful to others too. Here\u0026rsquo;s how to increase the post character limit on a Mastodon server. Bonus: how to increase the number of poll options as well.","title":"Increasing the character limit on a Mastodon server"},{"content":"","date":null,"permalink":"https://markok.dev/categories/mastodon/","section":"Categories","summary":"","title":"Mastodon"},{"content":"","date":null,"permalink":"https://markok.dev/tags/mastodon/","section":"Tags","summary":"","title":"Mastodon"},{"content":"","date":null,"permalink":"https://markok.dev/tags/tips/","section":"Tags","summary":"","title":"Tips"},{"content":"","date":null,"permalink":"https://markok.dev/categories/blog/","section":"Categories","summary":"","title":"Blog"},{"content":"","date":null,"permalink":"https://markok.dev/tags/hello-world/","section":"Tags","summary":"","title":"Hello World"},{"content":"Let\u0026rsquo;s start again with Hugo. First iteration of MarkoK.dev was a custom-made Laravel app. Second was a Discourse installation. Now let\u0026rsquo;s try Hugo.\nMy .dev is supposed to be a playground — a place for me to test stuff and do something stupid/cool.\nDiscourse is a great platform for discussions, but for blogging I prefer Hugo, WordPress, or even my own apps. It was a great learning experience, but just not the right fit for this use case.\nI didn\u0026rsquo;t want to bring back the old MarkoK.dev with Laravel either, since my MarkoKaartinen.net already runs on a custom Laravel app — and I wanted to keep the two separate. Hugo is a great fit for doing something like this, lightweight and fun to use.\nThis blog is my place to write about whatever I want, in English. The goal is to keep it easy, light, and simple - at least the writing part.\nThis is a bit of a mess for a blog post. Get used to it 😆\nCommenting is handled by giscus, which is basically a GitHub-powered discussion system. The blog is also fully public on GitHub.\nThis is the first iteration of this Hugo-based blog. More stuff is coming — hopefully some fun stuff too.\nAlright, I\u0026rsquo;m done rambling. See you next time.\nPhoto by Growtika on Unsplash\n","date":"Tue 3 March 2026","permalink":"https://markok.dev/blog/2026/hello-world-again/","section":"Blog","summary":"Let\u0026rsquo;s start again with Hugo. First iteration of MarkoK.dev was custom made Laravel app. Second was a Discourse installation. Now let\u0026rsquo;s try Hugo.","title":"Hello World (Again)"},{"content":"","date":"Tue 3 March 2026","permalink":"","section":"Links","summary":"List of ngrok, Cloudflare Tunnel, Tailscale, and ZeroTier alternatives and other tunneling software and services. Focus on self-hosting.","title":"awesome-tunneling"}]