<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Amiya's Desk</title>
  <subtitle>Notes, projects, and a little everyday tinkering</subtitle>
  <link href="https://blog.sayori.org/" rel="alternate" type="text/html"/>
  <link href="https://blog.sayori.org/atom.xml" rel="self" type="application/atom+xml"/>
  <id>https://blog.sayori.org/</id>
  <updated>2026-08-05T07:25:36.164Z</updated>
  <language>en</language>
  <entry>
    <title>Free AI API Entry Points: BaiPiao, innilove, and Several Navigation Sites</title>
    <link href="https://blog.sayori.org/en/posts/freeapi-glm-kimi-cc-switch/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/freeapi-glm-kimi-cc-switch/</id>
    <published>2026-06-25T00:00:00.000Z</published>
    <updated>2026-08-04T00:00:00.000Z</updated>
    <summary>Compiling a few entry points where you can still find free AI APIs, along with navigation sites suitable for checking public-benefit sites and free quotas.</summary>
    <content type="html"><![CDATA[<p>Here are a few for now:</p>
<ul>
<li>BaiPiao Free Resources Collection: <a href="https://baipiao.org/free/">https://baipiao.org/free/</a></li>
<li>innilove New API: <a href="https://api.innilove.xyz/keys">https://api.innilove.xyz/keys</a></li>
<li>Yangmao AI: <a href="https://yangmao.ai/zh/#ask">https://yangmao.ai/zh/#ask</a></li>
<li>Qiaoliangchaichu Public-Benefit API Navigation: <a href="https://link.qiaoliangchaichu.top/">https://link.qiaoliangchaichu.top/</a></li>
<li>HCNSEC API Navigation: <a href="https://link.hcnsec.cn/">https://link.hcnsec.cn/</a></li>
</ul>
<p>If you want to keep looking for similar entry points, you can directly open the <a href="https://nav.sayori.org/#cat-ai">AI category of the resource navigation</a>. This page collects the entry points mentioned in this article along with other commonly used AI tools. The status of the sites should still be verified on the target site itself.</p>
<blockquote>
<p>[!NOTE]
This article is compiled based on the pages seen on 2026-08-04. Free quotas, models, rate limits, and site status are all subject to change. Before actually using them, please refer to the official website and backend displays.</p>
</blockquote>
<p>If you haven't seen this post on the site, you can also check out <a href="/posts/anyrouter-sharedchat-cc-switch-student-guide/anyrouter-sharedchat-cc-switch-student-guide-en/">Anyrouter, Sharedchat, and AgentRouter Review and Usage</a>.</p>
<h2>Let's Clarify First</h2>
<p>innilove is an API entry point you can directly try.</p>
<p>BaiPiao, Yangmao, Qiaoliangchaichu, and HCNSEC are more like navigation sites, used for finding new public-benefit sites, free quotas, and proxy entry points.</p>
<p>Navigation pages are not Base URLs, nor are they API Key pages. Don't directly enter them into cc-switch.</p>
<h2>BaiPiao</h2>
<p>Entry Point:</p>
<p><a href="https://baipiao.org/free/">https://baipiao.org/free/</a></p>
<p>This is a comprehensive collection of free resources, not a single API service. The homepage categorizes resources by free API / models, VPS, domains, etc. The API category is under <a href="https://baipiao.org/free/api/">Free API / Models</a>.</p>
<p>The page indicates the last verification time and uses community votes to verify validity. Expired entries are moved to the bottom.</p>
<p>It's suitable for finding entry points, but not for directly using as a Base URL or API Key page. After clicking into a specific resource, you still need to go back to the original site to confirm registration conditions, interface address, model name, and quota.</p>
<h2>innilove New API</h2>
<p>Entry Point:</p>
<p><a href="https://api.innilove.xyz/keys">https://api.innilove.xyz/keys</a></p>
<p>This is the New API panel. Register, log in, and create a token on the Key page.</p>
<p>Currently, it supports common email providers like 163. You can also check in to get quotas. For models, primarily refer to the backend list; previously, models like DeepSeek and MiniMax were visible.</p>
<p>If the backend still uses standard OpenAI-compatible configurations, you can try this first:</p>
<pre><code>Provider Name: innilove New API
API Key: Key created on the page
Base URL: https://api.innilove.xyz/v1
Interface Format: OpenAI compatible
</code></pre>
<p>Do not copy model names, multipliers, and quotas from old articles. Log in and check the current page.</p>
<h2>Yangmao AI</h2>
<p>Entry Point:</p>
<p><a href="https://yangmao.ai/zh/#ask">https://yangmao.ai/zh/#ask</a></p>
<p>This is not a proxy site.</p>
<p>It's more like an AI tool and free quota intelligence site. The page organizes model platforms, API prices, free quotas, and regional restrictions, and also has a direct query entry point.</p>
<p>When looking for new APIs, you can search for the platform name here first, then click back to the official page to confirm.</p>
<h2>Qiaoliangchaichu Public-Benefit API Navigation</h2>
<p>Entry Point:</p>
<p><a href="https://link.qiaoliangchaichu.top/">https://link.qiaoliangchaichu.top/</a></p>
<p>The page title is "Public-Benefit API Navigation," and it includes public-benefit, free, and paid API services.</p>
<p>The homepage I saw this time is more like an aggregated entry point. You'll need to go into the page yourself to see which sites are listed and if registration is still possible.</p>
<p>The advantage of such navigation sites is that it saves you from digging through groups and posts everywhere. The disadvantage is also obvious: site statuses change very quickly, and just because an entry point opens doesn't mean the API will necessarily work.</p>
<h2>HCNSEC API Navigation</h2>
<p>Entry Point:</p>
<p><a href="https://link.hcnsec.cn/">https://link.hcnsec.cn/</a></p>
<p>Its positioning is more direct; the page states "Free Large Model API Proxy Navigation Network," categorizing into major vendors, general proxy sites, and public-benefit APIs.</p>
<p>The public list shows multiple model platforms and API entry points, and also mixes in some services that require real-name verification, phone numbers, or invitation conditions.</p>
<p>This is suitable for scanning new sites, but don't just throw your main account and code in just because you see the word "free."</p>
<h2>How to Choose</h2>
<p>If you want to set up cc-switch immediately, first go to BaiPiao's API / Model category, or generate a Key yourself after entering innilove.</p>
<p>If you want to find more entry points, check Yangmao first, then browse Qiaoliangchaichu and HCNSEC.</p>
<p>For new sites found on navigation pages, first confirm four things:</p>
<ol>
<li>Registration conditions</li>
<li>Whether real-name verification or a phone number is required</li>
<li>Where the Key page and API documentation are</li>
<li>How free quotas, model multipliers, and rate limits are specified</li>
</ol>
<p>After confirming everything, test with a very light request. Don't immediately run a long Agent.</p>
<h2>Setting up cc-switch</h2>
<p>BaiPiao cannot be directly entered into cc-switch; it's a resource directory. First, click into a specific entry and configure it according to the Base URL, API Key, and model name provided by that entry.</p>
<p>innilove can be filled in like this:</p>
<pre><code>Provider Name: innilove New API
API Key: The Key you generated in the console
Base URL: https://api.innilove.xyz/v1
Interface Format: OpenAI compatible
</code></pre>
<p>After saving, send a request first:</p>
<pre><code>Describe the model you are currently using in three sentences.
</code></pre>
<p>If it returns normally, then continue running code tasks.</p>
<p>If an error occurs, first check if the Base URL, model name, and Key are complete, then see if the quota has been used up.</p>
<h2>Security Reminder</h2>
<p>Free APIs and public-benefit proxies are not suitable for storing keys, accounts, unpublished code, or private chat logs.</p>
<p>Also, don't connect them to public services, group bots, or long-running Agents.</p>
<p>These types of entry points might work today, but that doesn't mean they'll still be available tomorrow.</p>
<p>Just treat them as backup and testing entry points. Don't rely your entire workflow on them.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="AI and Workflow"></category>
  </entry>
  <entry>
    <title>Riseup's 'Radical Servers' List: What Public Service Organizations Offer and What I Can Do</title>
    <link href="https://blog.sayori.org/en/posts/radical-servers-public-services/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/radical-servers-public-services/</id>
    <published>2026-07-19T00:00:00.000Z</published>
    <updated>2026-08-03T00:00:00.000Z</updated>
    <summary>Getting to know the non-commercial tech organizations and public services curated by Riseup, and documenting the web audit and API capabilities currently offered by sayori.org</summary>
    <content type="html"><![CDATA[<p>I recently stumbled upon a long list within Riseup's security resources.</p>
<p><a href="https://riseup.net/zh/security/resources/radical-servers">Radical Servers - riseup.net</a></p>
<p>Most projects on the list are maintained by non-profit organizations, autonomous tech collectives, cooperatives, or volunteer groups, providing internet infrastructure for social movements, grassroots organizations, non-commercial projects, and privacy-conscious individuals.</p>
<p>Some organizations offer email, mailing lists, and website hosting, while others maintain VPNs, XMPP, Matrix, Etherpad, file sharing, code hosting, or community networks.</p>
<p>This list gave me my first relatively comprehensive look at other public services in the corners of the internet.</p>
<p>I've also compiled the organizations mentioned in the article and the entry points offered by sayori.org into the <a href="https://nav.sayori.org/#cat-net-services">Network &amp; Services category of my resource navigation</a>. If you want to continue searching by service type, you can start there.</p>
<h2>Why Riseup Calls Them Radical Servers</h2>
<p>Riseup's explanation for this list is quite direct.</p>
<p>It includes anti-capitalist, anti-hierarchical, autonomous, feminist, or other radical tech projects.</p>
<p>Some of these groups provide free or mutual aid services for grassroots activists, while others focus more on privacy, free software, and decentralization.</p>
<p>The common thread isn't the tech stack, but rather not making profit the primary goal.</p>
<p>Riseup also explicitly states that this list does not constitute an official endorsement.</p>
<p>Each organization's region, legal environment, logging policy, registration method, and service status differ, so you should still read their terms and privacy statements before use.</p>
<h2>What's on This List</h2>
<p>The page is categorized by World Wide, South America, Europe, North America, and In memoriam.</p>
<p>Worldwide projects include hackerspaces.org, HackThisSite, Indymedia, and Take Back The Tech.</p>
<p>They lean towards community spaces, cybersecurity learning, independent media, and combating digital violence against women, respectively.</p>
<p>The South America section lists Codigosur and Colnodo.</p>
<p>These organizations provide hosting, email, mailing lists, streaming, collaborative editing, and technical support for social movements and non-profit groups.</p>
<p>The Europe section has the most entries.</p>
<p>Here you can find organizations with different focuses, such as Disroot, Framasoft, GreenNet, NoLog.cz, systemli, Syster Server, and Koumbit.</p>
<p>The services they offer vary widely:</p>
<ul>
<li>Email and mailing lists</li>
<li>Website, blog, Wiki, and forum hosting</li>
<li>XMPP, Matrix, Mumble, and video conferencing</li>
<li>Etherpad, CryptPad, and other collaboration tools</li>
<li>Git, project management, and file sharing</li>
<li>VPN, DNS, community networks, and virtual servers</li>
<li>Technical support for social movements, feminist groups, or non-commercial projects</li>
</ul>
<p>The North America section includes Riseup itself, as well as projects like Koumbit and Anarchy Planet.</p>
<p>The page also retains an 'In memoriam' section at the end.</p>
<p>These projects have ceased operation or are only in maintenance mode, yet they haven't been simply erased from history.</p>
<p>This part is important because public services can end. Maintainers leaving, funding changes, and legal risks can all cause a once-reliable entry point to disappear. This is precisely the risk that public service must bear.</p>
<h2>A Few Projects Worth Knowing Individually</h2>
<h3>Disroot</h3>
<p><a href="https://disroot.org/">Disroot</a> is a non-profit foundation based in Amsterdam, maintained by volunteers and relying on community support.</p>
<p>It brings together email, files, chat, collaborative documents, encrypted pastebins, and federated network tools into one open service collection.</p>
<p>I previously wrote a separate note about it: <a href="/posts/disroot-open-services-note/disroot-open-services-note-en/">Disroot: An Open Source Service Collection That Feels Like the Old Internet Ideal</a>.</p>
<h3>Framasoft</h3>
<p><a href="https://framasoft.org/">Framasoft</a> is from France and has long promoted free software, open education, and a decentralized internet.</p>
<p>It has created numerous public tools as alternatives to centralized platforms and continuously maintains software, documentation, and educational resources.</p>
<h3>systemli and NoLog.cz</h3>
<p><a href="https://www.systemli.org/">systemli</a> provides privacy-focused communication services for political activists and social movements.</p>
<p><a href="https://nolog.cz/">NoLog.cz</a> is a Czech activist tech collective, offering Matrix, file sharing, collaborative documents, video, and other free software services.</p>
<p>These types of organizations usually don't promise unlimited resources for everyone; instead, they clearly define their target audience, application methods, and usage boundaries.</p>
<h3>GreenNet and Koumbit</h3>
<p><a href="https://www.greennet.org.uk/">GreenNet</a> provides internet services, website, and hosting support for peace, environmental, and human rights groups.</p>
<p><a href="https://www.koumbit.org/">Koumbit</a> is a non-profit organization in Montreal, providing free software technical services for community groups and social justice projects, and also has a solidarity hosting program.</p>
<p>They remind me that public tech services aren't necessarily all free.</p>
<p>Reasonable fees, cross-subsidies, donations, and volunteer labor can all be ways to sustain services.</p>
<h2>Three Things to Confirm Before Using This List</h2>
<p>I actually visited this list on July 19, 2026, and the directory still includes World Wide, South America, Europe, North America, and In memoriam.</p>
<p>This only proves that Riseup's directory page is currently accessible; it doesn't certify that every organization on the list still offers open services.</p>
<p>First, check if the project is still running.
This page retains historical entries, and some service descriptions and quotas might be outdated.</p>
<p>Second, check who is eligible to apply.
Some services are only for specific regions, social movements, non-profit organizations, or invited users; you can't just register because you see 'free'.</p>
<p>Third, check legal and data boundaries.
Privacy-friendly doesn't mean absolute anonymity, nor does it mean you can ignore backups, account recovery, and local laws.
Important data should still be kept with your own encrypted backups; don't treat any single organization as infrastructure that will never shut down.</p>
<h2>What I Can Learn from This List</h2>
<p>I haven't registered sayori.org as a public service organization, nor do I have the funding, members, or long-term governance experience of these groups.</p>
<p>Therefore, I won't compare my small services with Riseup or Disroot on the same scale.</p>
<p>What I can learn is how they describe their target users, disclose boundaries, rely on donations, limit abuse, and acknowledge that services may cease.</p>
<p>Rather than continuing to pile up many entry points, I'd rather maintain a small number of truly sustainable services.</p>
<h2>Services Currently Offered by sayori.org</h2>
<p>The full status is available in the <a href="https://sayori.org/zh/services/">sayori.org Public Services documentation</a>.</p>
<h3>GeoScore Web Audit</h3>
<p><a href="https://geo.sayori.org/">GeoScore</a> is a registration-free SEO and GEO factual audit tool.</p>
<p>It targets public web pages, organizing site profiles, sampling pages, checking evidence, prioritizing fixes, and generating Markdown reports.</p>
<p>It does not automatically modify target websites, nor does it package predictive results as genuine AI citation rates.</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/7ebaa553f6f842f62c87a9b5e83e1b10b5c7a5ddd4e5b39074c9948f7de11ebf/1264.webp" alt="GeoScore Introduction" loading="lazy" width="560" height="175" srcset="https://img.sayori.org/blog/v1/7ebaa553f6f842f62c87a9b5e83e1b10b5c7a5ddd4e5b39074c9948f7de11ebf/640.webp 640w, https://img.sayori.org/blog/v1/7ebaa553f6f842f62c87a9b5e83e1b10b5c7a5ddd4e5b39074c9948f7de11ebf/1264.webp 1264w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;GeoScore Introduction&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<h3>GeoScore Public Audit API</h3>
<p>I can currently also provide a public API service.</p>
<p>The entry point is <a href="https://geo-api.sayori.org/">geo-api.sayori.org</a>.</p>
<p>It provides a stable public interface for GeoScore, allowing public domain audits, reading deployment metadata, obtaining PageSpeed evidence, and generating an Evidence Map or FixPack from existing audits.</p>
<p>The API's request structure, responses, and error codes are documented in the <a href="https://geo-api.sayori.org/openapi.json">OpenAPI documentation</a>, with Chinese usage instructions in <a href="https://geo.sayori.org/docs">GeoScore Docs</a>.</p>
<p>The smallest site audit request is as follows:</p>
<pre><code>curl "https://geo-api.sayori.org/api/audit/example.com"
</code></pre>
<p>This interface returns a Server-Sent Events stream, with site mode extracting a maximum of five HTML pages.</p>
<p>Operational limits are based on the live results from <a href="https://geo-api.sayori.org/api/meta"><code>/api/meta</code></a>.</p>
<p>It only accepts public hostnames and does not support localhost, internal IP addresses, IP literals, or arbitrary proxy requests.</p>
<p>The public API also operates on a best-effort basis and may be rate-limited or paused if quotas are exhausted, abuse occurs, or upstream failures happen.</p>
<h3>Amiya's Whiteboard</h3>
<p><a href="https://board.sayori.org/">Amiya's Whiteboard</a> is a lightweight, registration-free browser whiteboard.</p>
<p>It's suitable for quick sketches, organizing rough drafts, clarifying a page structure, or sending someone a collaborative canvas that can be opened directly. It's quite useful for drawing temporary flowcharts or other things to visualize your ideas.</p>
<p>The whiteboard is still maintained on a best-effort basis and does not guarantee long-term preservation of important content. Users should export any results they wish to keep.</p>
<h3>Blog, RSS, and Feedback</h3>
<p>The <a href="https://blog.sayori.org/">blog</a> and <a href="https://blog.sayori.org/rss.xml">RSS</a> are used to publish articles, tutorials, and project records.</p>
<p>The message board and email are for receiving service issues and improvement suggestions.</p>
<h2>Search Gateway's Boundaries</h2>
<p><a href="https://github.com/Amiyadesi/search-gateway">Search Gateway</a> remains open source, can be self-deployed, and offers compatible API and MCP access methods.</p>
<p>However, <code>search.sayori.org</code> is the site owner's internal instance, requiring authentication, and does not provide anonymous calls, shared tokens, or public search quotas.</p>
<p>The public GeoScore API and the internal Search Gateway must be explained separately.</p>
<p>The former is a callable public service, while the latter is self-deployable software and private infrastructure.</p>
<h2>Next Steps</h2>
<p>I want to continue organizing this list of radical servers, prioritizing organizations that are still running, understandable to Chinese users, and have clearly defined service boundaries.</p>
<p>For my own site, I will first ensure the stability of the GeoScore web version, public audit API, blog, and RSS.</p>
<p>If I later add website health check mutual aid, static site launch assistance, or a small quota for search evidence, these will also be handled by invitation, limited quotas, and manual processing.</p>
<p>I strive to do my utmost to help others.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>Disroot: A Collection of Open-Source Services That Feels Like the Old Internet Ideal</title>
    <link href="https://blog.sayori.org/en/posts/disroot-open-services-note/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/disroot-open-services-note/</id>
    <published>2026-06-27T00:00:00.000Z</published>
    <updated>2026-08-03T00:00:00.000Z</updated>
    <summary>Documenting Disroot's email, cloud storage, XMPP, and collaboration tools, and using it as an opportunity to reorganize sayori.org's public services suitable for long-term maintenance.</summary>
    <content type="html"><![CDATA[<blockquote>
<p>[!NOTE]
This note is from June 27, 2026. Disroot's registration questions, service quotas, and available features might change, so check their official website before applying.</p>
</blockquote>
<p>Today, I also discovered a very interesting open-source organization: <a href="https://disroot.org/">Disroot</a></p>
<p>This organization gathers a bunch of open internet tools and diligently maintains them into a platform that can be used daily.</p>
<p>Their official website clearly describes itself as: free, private, federated, decentralized.</p>
<p>No ads, no tracking, no profiling, no data mining. Pure public benefit, truly living up to its .org name.</p>
<h2>What it offers</h2>
<p>The list of services is here:</p>
<p><a href="https://disroot.org/en/services">https://disroot.org/en/services</a></p>
<p>Currently, it offers these:</p>
<ul>
<li>Email, accessible via webmail or IMAP clients</li>
<li>Cloud, based on Nextcloud, for syncing files, calendars, and contacts</li>
<li>XMPP Chat, a decentralized chat protocol</li>
<li>Pads, online collaborative documents</li>
<li>PrivateBin, encrypted pastebin</li>
<li>Upload, temporary file sharing</li>
<li>Forgejo, code hosting</li>
<li>CryptPad, a privacy-focused online document suite</li>
<li>FEDIsroot, at <a href="https://fe.disroot.org/">fe.disroot.org</a>, an Akkoma-based ActivityPub / Fediverse microblogging service, compatible with Mastodon API</li>
<li>LibreTranslate, translation service</li>
<li>Vault, password management related service</li>
</ul>
<p>If you want to compare other public-benefit or community-maintained services, you can check out the <a href="https://nav.sayori.org/#cat-net-services">Network &amp; Services category in the Resource Navigation</a>. This section continuously collects entries actually mentioned in articles and that have undergone basic checks.</p>
<p>You don't necessarily have to use every single one.</p>
<p>But that's where its charm lies: you register one account, and you can enjoy so many open-source services.</p>
<p>For someone like me, who loves tinkering with personal websites, servers, and open-source services, this is truly appealing, and a senior example worth learning from.</p>
<h2>The Registration Question is a Bit Peculiar</h2>
<p>The registration entry is here:</p>
<p><a href="https://user.disroot.org/pwm/public/newuser/">https://user.disroot.org/pwm/public/newuser/</a></p>
<p>The registration question I saw this time was: What do you like to do before bed?</p>
<p>And it requires more than 50 words.</p>
<p>This question is quite clever.</p>
<p>You can first write a thoughtful paragraph in Chinese or another language, then translate it into English.</p>
<p>For example, you could write about reading before bed, organizing tomorrow's tasks, listening to music, browsing some open-source community updates, or simply putting your phone away to get to sleep earlier.</p>
<h2>How I'd Use It</h2>
<p>Currently, I've registered an account, but for me, only the email service is particularly interesting right now. After all, I've registered so many accounts and communities, accumulating a pile of unique domain-based emails, plus my own self-hosted temporary and domain emails.</p>
<p>Although it offers a public-benefit Vaultwarden service, I already self-host my own, so I don't really need this kind of thing.</p>
<p>Moreover, Disroot isn't a free tier from a big tech company; it survives on community and donations. Being able to use it when needed is already great.</p>
<h2>It Also Made Me Re-evaluate My Own Services</h2>
<p>After seeing the list of services collected by Disroot and <a href="/posts/radical-servers-public-services/radical-servers-public-services-en/">Riseup</a>, my first reaction was also to keep adding things to sayori.org, wanting to live up to the .org name.</p>
<p>However, my personal capacity is limited. After consulting with GPT, it helped me create a public services list, which is available here: <a href="https://sayori.org/zh/services/">https://sayori.org/zh/services/</a></p>
<p>Currently, what's truly open to the public are mainly GeoScore, blog posts, RSS, whiteboards, and feedback. Search Gateway remains open source, but the online instance is only for my own sites and maintenance tasks.</p>
<p>Instead of continuously piling on new services, I'd rather first try a few very small-scope directions: performing website health checks for personal blogs, helping non-commercial static sites go live, providing a small quota for search evidence, and low-frequency RSS-to-email or Webhook notifications.</p>
<p>None of these will start as anonymous public platforms; instead, they'll begin with invitations, quotas, and manual processing. If there's no demand, they'll stop; if maintenance costs exceed my capacity, they'll also stop.</p>
<p>I'm now more inclined to call say</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>The Creator's Confidence Cycle – Trapped Within It</title>
    <link href="https://blog.sayori.org/en/posts/creaters-confidence-circle/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/creaters-confidence-circle/</id>
    <published>2026-08-01T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>The Creator's Confidence Cycle – Trapped Within It — Let's find a way out!</summary>
    <content type="html"><![CDATA[<h1>What is the Confidence Cycle?</h1>
<p>I wonder if you've ever experienced a moment like this.</p>
<p>One morning, a brilliant idea suddenly pops into your head – for instance, you want to write an article about the 'creator's confidence cycle.' You think it's absolutely fascinating; looking back at your own creative journey, all those ups and downs perfectly confirm this pattern. You excitedly rush to discuss it with AI, chat with friends, and then, full of confidence, you sit in front of your computer and type the first line.</p>
<p>One line, two lines...</p>
<p>Suddenly, your fingers slow down on the keyboard. A voice echoes in your mind: "These obvious truths, even I can think of them. Don't others have brains to figure it out themselves? Is it really necessary to write this down?"</p>
<p>You quickly argue with yourself internally: "Build in public! Open creation inherently involves repetition. Maybe some people already know, but it can definitely help those who are deeply stuck and don't even realize it!"</p>
<p>You barely manage to counteract the anxiety with this line of reasoning and continue writing. But once doubt takes root, it doesn't easily disappear.</p>
<p>When you're halfway through the article, you stare at the screen, and a huge sense of emptiness washes over you: "What garbage am I even writing? This is illogical, dry, and boring. Public creation doesn't mean you can just 'dump crap' on the internet!" The seeds of doubt begin to sprout and grow wildly. All those comforting words from before completely lose their power. The more you look, the more superfluous you feel, even believing that in this excellent internet world, you yourself are an unnecessary existence.</p>
<p>But in the end, you don't press that 'delete all' backspace key.</p>
<p>Perhaps it's unwillingness to give up, or some damned sense of responsibility, but you push through with the thought of "I'm trash," and continue writing in a self-deprecating manner.</p>
<p>Doubt bore bitter fruit, but you chose to swallow it and keep typing. Curiously, with every word you typed, that plant of doubt began to wither. You slowly realized: things weren't as bad as you imagined. You could still think, still create, you were still alive.</p>
<p>Finally, when you typed the last period, looking at the article that was much longer than any middle school final exam essay, a huge sense of pride swelled in your heart. You looked at this "garbage," and suddenly it seemed alright. In that moment, you just wanted to show it to the whole world, loudly declaring: "I made it! I'm not a coward!"</p>
<p>Welcome to the creator's destiny – this is the "confidence cycle."</p>
<h1>The Scientific Principles Behind the Confidence Cycle</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 800px;"&gt;
&lt;a href="https://personalexcellence.co/blog/emotional-journey-creating-infographic/" target="_blank" rel="noopener noreferrer"&gt;&lt;img src="https://img.sayori.org/blog/v1/368dd4b2e474dc01c851e0de7d518ff2d09935580cc33435b8f3b582bfaa5743/800.webp" alt="我去果然有别人做过了，点击可以看看别人的讲解" loading="lazy" width="800" height="441" srcset="https://img.sayori.org/blog/v1/368dd4b2e474dc01c851e0de7d518ff2d09935580cc33435b8f3b582bfaa5743/640.webp 640w, https://img.sayori.org/blog/v1/368dd4b2e474dc01c851e0de7d518ff2d09935580cc33435b8f3b582bfaa5743/800.webp 800w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;&lt;/a&gt;
&lt;figcaption&gt;&lt;a href="https://personalexcellence.co/blog/emotional-journey-creating-infographic/" target="_blank" rel="noopener noreferrer"&gt;我去果然有别人做过了，点击可以看看别人的讲解&lt;/a&gt;&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>I don't know if the above words resonated with you, &lt;span class="sayori-spoiler" tabindex="0"&gt;but when I wrote that little story above, I certainly got emotional&lt;/span&gt;. Actually, this is a very scientific phenomenon, and others have even explained it long ago &lt;span class="sayori-spoiler" tabindex="0"&gt;nothing new under the sun, huh...&lt;/span&gt;. Of course, since I'm in the mood, I'll try to explain it in my own words. The following are results I found after asking AI and looking through various encyclopedias. Let's take a look at the relevant scientific principles.</p>
<h2>The Eureka Effect (Aha! Moment)</h2>
<p><strong>Eureka effect</strong>, also known as <strong>Aha! moment</strong> or <strong>eureka moment</strong>, refers to the moment when a person suddenly understands a problem or concept that was previously incomprehensible. At this point, a previously unsolvable problem suddenly becomes clear and obvious. This shift from not understanding to spontaneous comprehension and realization is often accompanied by joy, satisfaction, and exclamation[^1].</p>
<p>When you first start creating, which is usually when you've decided what you're going to do, you feel incredibly confident. Because you've set your goal, you feel like you see a bright future beckoning. You've just broken through a concept, and it's the peak of the Eureka moment, a very comfortable experience for a creator. At this point, you might even feel that the world is quite beautiful, and wanting to share it with the whole world is precisely to share that beauty.</p>
<h2>The Taste Gap and Semantic Satiation</h2>
<p><strong>The Taste Gap:</strong> Quoting American media personality Ira Glass, if you think your work is bad, <strong>it's not because your ability has declined, but because your "taste" has always been high.</strong> Your vision has outpaced your hands, or you could say you have champagne taste on a beer budget (literally "eyes high, hands low").</p>
<p><strong>Semantic Satiation:</strong>[^2] A <a href="https://zh.wikipedia.org/wiki/%E5%BF%83%E7%90%86%E5%AD%A6">psychological</a> phenomenon where, after staring at a <a href="https://zh.wikipedia.org/wiki/%E6%96%87%E5%AD%97">character</a> or a <a href="https://zh.wikipedia.org/wiki/%E5%8D%95%E8%AF%8D">word</a> repeatedly for a long time, a person may suddenly find that they no longer recognize that character or word.</p>
<p>When these two are superimposed on your creative work, it means that as you develop, you increasingly find a growing gap between what's actually produced and what you imagined. At the same time, because you've been working on the same creation, you also fall into a kind of <strong>creative satiation</strong>, similar to semantic satiation. After repetitive creation, you increasingly look down on your own project, and with the taste gap added on, it's inevitable to fall into negative emotions.</p>
<h2>Imposter Syndrome</h2>
<p><strong>Imposter Syndrome:</strong>[^3] Also known as <strong>fraud syndrome</strong>, people with imposter syndrome are unable to attribute their success to their own abilities and constantly worry that one day others will discover that they are actually frauds. They firmly believe that their success is not due to their own efforts or abilities, but rather to luck, good timing, or others mistakenly thinking they are highly capable and intelligent. Even when real-world evidence indicates that they do possess excellent talents, they still believe they are merely imposters and do not deserve their success.</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 1080px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/c5a6fc6e8718915edea23ca380d7d029e7e8ff165f15cf0419cf7c670c04b34d/1280.webp" alt="我去这简直就是我" loading="lazy" width="1080" height="332" srcset="https://img.sayori.org/blog/v1/c5a6fc6e8718915edea23ca380d7d029e7e8ff165f15cf0419cf7c670c04b34d/640.webp 640w, https://img.sayori.org/blog/v1/c5a6fc6e8718915edea23ca380d7d029e7e8ff165f15cf0419cf7c670c04b34d/1280.webp 1280w, https://img.sayori.org/blog/v1/c5a6fc6e8718915edea23ca380d7d029e7e8ff165f15cf0419cf7c670c04b34d/1671.webp 1671w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;我去这简直就是我&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>When you enter your worst state, imposter syndrome makes you feel like you really are a fraud, not someone great, just an insignificant nobody, making you even more afraid to show yourself. At this point, if you choose to give up, it will truly meet your expectations, meaning, self-doubt wins...</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 800px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/18f038a645e08b7311993c88e3f135ba1cfe99c5b059695a5403122fa5182191/659.webp" alt="Pasted image 20260609215751.png" loading="lazy" width="800" height="342" srcset="https://img.sayori.org/blog/v1/18f038a645e08b7311993c88e3f135ba1cfe99c5b059695a5403122fa5182191/640.webp 640w, https://img.sayori.org/blog/v1/18f038a645e08b7311993c88e3f135ba1cfe99c5b059695a5403122fa5182191/659.webp 659w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;/figure&gt;</p>
<p>Next episode, Northward!</p>
<h1>How to Successfully Navigate the Cycle</h1>
<p>To be honest, I really wanted to just copy <a href="https://personalexcellence.co/blog/emotional-journey-creating-infographic/">other people's research conclusions</a>, because they're truly comprehensive, and I myself got caught up in the story I was writing... But since things have come to this, I'll just keep writing like this.</p>
<p>There's a common phenomenon in long-distance running – usually, when you hit the third or fourth kilometer, your mind and body feel the worst. As an amateur runner for two and a half years, I've naturally experienced this many times. But as long as you ignore what your mind is thinking and just mechanically keep your legs moving, push past that critical point, and it actually gets easier afterward.</p>
<p>It's the same in creation. As long as you're still creating, it means you're still going through that cycle. So, once you've reached the darkest point, only light remains afterward. Persistence[^4] is victory! Victory!</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 1000px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/0949563eb955fbd0e46cf2d177e22897c7e56e38fd8e4951cc701b12e4f088b6/1280.webp" alt="一家三口参上！" loading="lazy" width="1000" height="512" srcset="https://img.sayori.org/blog/v1/0949563eb955fbd0e46cf2d177e22897c7e56e38fd8e4951cc701b12e4f088b6/640.webp 640w, https://img.sayori.org/blog/v1/0949563eb955fbd0e46cf2d177e22897c7e56e38fd8e4951cc701b12e4f088b6/1280.webp 1280w, https://img.sayori.org/blog/v1/0949563eb955fbd0e46cf2d177e22897c7e56e38fd8e4951cc701b12e4f088b6/1841.webp 1841w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;一家三口参上！&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>Besides gritting your teeth and persevering, there's one more crucial thing:
That is, don't overestimate yourself, hey! You don't really think what you create has some world-changing magic, do you? In reality, it'll most likely be ignored after it's done... With that mindset, just keep working on it in a self-deprecating way! That way, if there's an unexpected fruit of victory, it'll be especially sweet. And even if it does turn out as expected, you yourself will still be stronger than you were before finishing it! After all, they say you should compare yourself to yourself, right? Being able to surpass yesterday's self is already great!</p>
<h1>Epilogue</h1>
<p>Ehh, let me see how many words I've written... Holy cow, over two thousand words, I'm amazing, hahaha!</p>
<p>I wish everyone who reads this, may your future creations be divinely inspired: paintings effortlessly perfect, music heavenly, videos hit millions of views, and games fulfill your dreams! I hope this article helps you. I'm Amiya_desi, and I'll see you in the next interesting discussion!</p>
<p>Feel free to discuss any interesting suggestions or topics in the comments! This is my first time writing such a long article, so please point out any shortcomings. Every comment you leave is a treasure!</p>
<p>[^1]: Quoted from <a href="https://zh.wikipedia.org/wiki/%E5%B0%A4%E9%87%8C%E5%8D%A1%E6%95%88%E5%BA%94">Eureka effect (Wikipedia)</a></p>
<p>[^2]: Excerpted from <a href="https://zh.wikipedia.org/wiki/%E8%AF%AD%E4%B9%89%E9%A5%B1%E5%92%8C">Semantic Satiation (Wikipedia)</a></p>
<p>[^3]: Excerpted from <a href="https://zh.wikipedia.org/wiki/%E5%86%92%E5%90%8D%E9%A0%82%E6%9B%BF%E7%97%87%E5%80%99%E7%BE%A4">Imposter Syndrome (Wikipedia)</a></p>
<p>[^4]: As long as you're still creating, observing, and willing to adjust, the darkest phase isn't the conclusion. What follows might not be a huge success for your work, but it could be that it finally gets better, you trim it down to completion, or you realize where you should stop. Persistence isn't stubbornly sticking to the current plan, but rather not immediately judging a low point as your own failure.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Writing Experiment"></category>
  </entry>
  <entry>
    <title>Reflections After GMTK Jam</title>
    <link href="https://blog.sayori.org/en/posts/after-gmtk/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/after-gmtk/</id>
    <published>2026-07-27T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>In the last six hours of GMTK Jam, I cut down the unfinished puzzles and submitted a small game that was actually playable.</summary>
    <content type="html"><![CDATA[<h1>It's done, but I can't be happy about it.</h1>
<p>GMTK is done, here's the link: <a href="https://amiya-desi.itch.io/last-minute-echo">Last Minute Echo by Amiya_desi</a>. In the end, it turned out to be just a small game. Even though it's at least a complete little game with win and loss conditions, I can't feel happy about it at all.</p>
<h1>My Journey</h1>
<h2>At the Beginning</h2>
<p>When I first saw the GMTK theme was 'countdown', I thought it was pretty simple and comfortable. Plus, I already had a previous work that fit the theme quite well: <a href="https://amiya-desi.itch.io/time-rewind-linker">TimeRewindLinker by Amiya_desi</a>. I planned to build on its time-rewind mechanic by adding countdown-limited puzzles. Oh my god, what a brilliant idea! The kind that could get into <a href="/essays/thanks-encourage/">Thanks for the Encouragement</a> (fog). Thinking I'd come up with such a great idea, victory was simply a given (joy).</p>
<h2>Development and Fury in Between</h2>
<p>Because I thought of how well it would fit with my previous work, I was super excited. So I just discussed an initial version with AI and started... and then hell broke loose... The AI's changes always felt off to me, and it seems I've been relying on AI 'wheelchairs' too much. I was too lazy to even create a graybox level myself, only knowing how to make the AI 'draw cards' directly, generating everything from skeleton to flesh in one go. Just like Regulus, I've become stupid from using the 'wheelchair' too much QAQ.</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 640px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/d2a24c41c5aa3b148f74fd383bc50f9c51d34ec009815aaf23931125759d425a/499.webp" alt="Pasted image 20260727222142.png" loading="lazy" width="640" height="264" decoding="async" /&gt;
&lt;/figure&gt;</p>
<p>Who would've thought that when I finally mustered the courage to look at the scene the AI had built for me in the last six hours, I'd have a brain hemorrhage? I still remember one specific point:
<code>Who would've thought this human-machine would make a trap block not by creating a separate scene for a trap prefab and then instantiating it in the main scene, but by mysteriously putting a trap texture on a trap tile, and then under a trap Node2d, placing a bunch of Area2Ds around these spikes? How am I supposed to modify this? If I had just cohesive scenes from the start, I'd only need to place them. But this is all scattered and broken apart! I have to move them one by one. What the hell am I supposed to move?!</code></p>
<h2>The Final Decision and Sprint</h2>
<p>So, when sanity finally returned, I decisively chose the former between submitting a complete but very small work and another that looked grand but wasn't even playable. I cut all the puzzles, returned to a single goal: dodging the pursuer. Once the goal was clear, I only needed the AI to write the pursuer's algorithm and some win/loss conditions and scenes, while I focused on salvaging the map. Finally, in the last 10 minutes, I finished and submitted it. At least it was done... Although the pursuer's AI was still quite dumb, to make it not too easy, I added a bit of teleportation, which, of course, led to other problems, but there was no time left.</p>
<h1>Post-Jam Reflection</h1>
<p>Played with 'wheelchairs' too much, and Uncle GMTK totally wrecked me. At least in the end, I finally grasped the 'Reverse Sorcerer' technique and barely managed to survive and finish...
Damn it, shouldn't I be the strongest?! To become the strongest, it seems I still have a long way to go... GMTK, I probably won't ever forget you in this lifetime...</p>
<p>Actually, my diary from that day also summarized a lot. If you're interested, you can check out <a href="/posts/diary/2026-07-26/2026-07-26-en/">2026-07-26</a>. That's basically the mental journey I wrote down during my moment of transformation, when inspiration struck.</p>
<p>Finally, kids, don't rely on 'wheelchairs' too much in the future! Maintain independent thought. Don't answer, don't answer, don't answer!
&lt;span class="sayori-spoiler" tabindex="0"&gt;But comments are very welcome (<em>^_^</em>)&lt;/span&gt;</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Game Development"></category>
  </entry>
  <entry>
    <title>GeoScore 2.4.5: A Tool for Webmasters to Figure Out What Their Site is Really Missing</title>
    <link href="https://blog.sayori.org/en/posts/geoscore-2-4-guide/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/geoscore-2-4-guide/</id>
    <published>2026-07-16T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>Using site profiles, real crawl evidence, and repair reports to understand what a website truly lacks.</summary>
    <content type="html"><![CDATA[<h1>GeoScore 2.4.5: A Tool for Webmasters to Figure Out What Their Site is Really Missing</h1>
<h2>First, the Reason for Making It</h2>
<p>The old version of GeoScore was a project already developed by someone else, <a href="https://geoscoreapp.pages.dev/">https://geoscoreapp.pages.dev/</a>. You can try it out there. I also tried to use it to continuously optimize my website's SEO, even adding <a href="https://www.wikidata.org/wiki/Q140378510">Amiya's Desk</a> and <a href="https://www.wikidata.org/wiki/Q140378992">Amiya_desi</a> to Wikidata lists to enhance geo and SEO, and so on.</p>
<p>However, the project later showed its limitations. My personal blog often received suggestions to add FAQ, pricing tables, or Service schema, but my site has neither packages nor takes on projects.</p>
<p>Anyway, I'm not short on AI credits, and since I have a need, I decided to fork it and continue development. This time, I definitely need to get the categorization right. For a personal blog site, I feel that FAQ pricing tables and Service schema are indeed unnecessary.</p>
<p>GeoScore was re-developed based on the original author's work, <a href="https://github.com/sprawf/geoscore">https://github.com/sprawf/geoscore</a>. The original GeoScore was under the MIT license, so I chose to inherit that.</p>
<p>It's an open-source SEO and GEO auditing tool under the MIT license. The entry point and source code are here:</p>
<p><a href="https://geo.sayori.org">https://geo.sayori.org</a></p>
<p><a href="https://github.com/Amiyadesi/geoscore">https://github.com/Amiyadesi/geoscore</a></p>
<p>The complete English and Chinese user documentation is here:</p>
<p><a href="https://geo.sayori.org/docs">https://geo.sayori.org/docs</a></p>
<p>Its job is to separate already discovered issues, unknown issues, and inapplicable issues, then provide verifiable modification paths for webmasters, and generate modification conclusions into Markdown documents to feed to AI for targeted enhancement.</p>
<h2>The Core of 2.4.5 is Still Distinguishing Between Conclusions and Guesses</h2>
<p>Each fact check has only five states:</p>
<table>
<thead>
<tr>
<th>State</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>pass</code></td>
<td>Confirmed as passed from the page or response</td>
</tr>
<tr>
<td><code>fail</code></td>
<td>Clear evidence indicates a need for action</td>
</tr>
<tr>
<td><code>not_applicable</code></td>
<td>This rule is not suitable for the current site or page</td>
</tr>
<tr>
<td><code>unknown</code></td>
<td>Not enough evidence to judge at present</td>
</tr>
<tr>
<td><code>error</code></td>
<td>Issue with crawling or external service</td>
</tr>
</tbody>
</table>
<p>Only <code>pass</code> and <code>fail</code> that are confirmed applicable and have a conclusion will contribute to the factual score.</p>
<p><code>unknown</code> and <code>error</code> will not be misrepresented as failures, but they will reduce coverage and confidence.</p>
<p>When there's too little evidence, GeoScore would rather show insufficient evidence, which actually highlights many shortcomings in that area.</p>
<p>2.4 added a critical failure capping mechanism.</p>
<p>One critical failure will cap the highest score for the corresponding category at 49. Each additional critical failure reduces it by another 10, down to a minimum of 19.</p>
<p>One major failure will cap the limit at 79. Each additional major failure reduces it by another 10, down to a minimum of 49.</p>
<p>Minor failures have a lighter impact but cannot be completely ignored.</p>
<p>This rule is to prevent a site that is <code>noindexed</code>, uncrawlable, or has unextractable main content from getting a seemingly safe high score report just because its image alt text and Open Graph are well done.</p>
<p>So, my order for reviewing results is very rigid: first, look at critical failures and evidence, then coverage and confidence, and finally the total score.</p>
<h2>How 73 Real Sites Participated in Calibration</h2>
<p>I didn't want to just use my own blog to prove the accuracy of classification, so I now maintain a 73-site type calibration matrix.</p>
<p>It includes news media, personal blogs, portfolios, documentation sites, open-source projects, e-commerce, communities, SaaS, professional services, local businesses, non-profits, government, and university sites.</p>
<p>Each site first has its acceptable type range defined, then the current code independently crawls and determines its type.</p>
<p>The last two runs yielded 48 matches, 0 requiring manual review, and 25 unavailable, and 47 matches, 0 requiring manual review, and 26 unavailable, respectively.</p>
<p>The difference of one site between the two results comes from real network availability, not a new classification conflict.</p>
<p>All successfully crawled and judged samples fell within the pre-allowed type range.</p>
<p>Unavailable usually comes from WAF, regional restrictions, network errors, or verification pages. It doesn't mean classification passed, nor does it mean it failed.</p>
<p>These 25 sites will remain in the matrix because auditing tools truly need to deal with these uncooperative pages.</p>
<p>The scoring itself is calibrated separately using golden HTML fixtures.</p>
<p>Personal blogs, SaaS, e-commerce, local businesses, media, and unknown sites all have fixed evidence and score ranges. Critical failure capping also has independent regression tests.</p>
<p>The real site matrix is responsible for discovering classification deviations, and golden fixtures ensure score changes are repeatable. These two things should not be conflated into a pretty success rate.</p>
<h2>Site Mode and Single URL Mode</h2>
<p>GeoScore has two modes of use.</p>
<p>Entering a domain name will enter site mode, which extracts up to five representative HTML pages.</p>
<p>The homepage will be read first. If an About page is found, it will be included. Then, other samples will be selected from the sitemap or internal links on the homepage based on path type.</p>
<p>Five pages are not a full-site crawler; it merely controls an audit within an interpretable and repeatable scope.</p>
<p>Therefore, the sample list in the report is worth looking at, as it tells you which pages this conclusion came from.</p>
<p>If I only want to check a new article, a recently modified landing page, or a specific topic page, I can paste the full URL.</p>
<p>This enters single URL mode, focusing on auditing the target page.</p>
<p>When the target page is not the homepage, the tool will still read the homepage to establish context if needed, to avoid classifying the entire site as SaaS based solely on an article about AI.</p>
<p>I usually run the domain first to confirm the site's public configuration and profile, then run a single URL audit for the pages that actually need changes.</p>
<h2>First, Confirm How It Identifies You</h2>
<p>After the audit is complete, don't immediately focus on the total score.</p>
<p>First, look at the site profile.</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 360px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/a17c8b2344b2445b77faaaa3efa85c76dcbafbb065d18e8d937ccf4134f99478/771.webp" alt="Pasted image 20260720112010.png" loading="lazy" width="360" height="115" srcset="https://img.sayori.org/blog/v1/a17c8b2344b2445b77faaaa3efa85c76dcbafbb065d18e8d937ccf4134f99478/640.webp 640w, https://img.sayori.org/blog/v1/a17c8b2344b2445b77faaaa3efa85c76dcbafbb065d18e8d937ccf4134f99478/771.webp 771w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;/figure&gt;</p>
<p>This will display the site type, entity, language, root domain, sampled pages, identification confidence, and classification evidence.</p>
<p>The profile primarily relies on JSON-LD, canonical, title, navigation, and page structure. Body keywords are only considered weak signals.</p>
<p>This is to prevent personal blogs from being classified as SaaS, documentation sites as e-commerce, or article sites from being forced into commercial schema.</p>
<p>If the type is indeed incorrect, you can provide a type hint for this audit only. Click "Correct Type" to select the right type.</p>
<p>This does not mean writing a permanent rule for the entire system, nor will it affect other websites.</p>
<h2>Why Can't It Keep Calculating When Pages Can't Be Crawled?</h2>
<p>Real websites often don't return the main content directly.</p>
<p>Some sites return a Cloudflare challenge, some return a login or consent page, and SiteGround might even return a <code>/.well-known/sgcaptcha/</code> verification page with HTTP 202.</p>
<p>These pages also look like HTML, but using them for SEO auditing would only result in a fake report about a verification page.</p>
<p>2.4.5 will first identify these intermediate pages and no longer treat HTTP 202 or empty verification pages as successful crawls.</p>
<p>For ordinary HTTP confirmations encountering challenges, retriable network errors, or JavaScript shells, the homepage can use a Cloudflare Browser Run as a fallback.</p>
<p>This attempt has a clear 20-second budget.</p>
<p>Page navigation uses a maximum of 16.5 seconds, followed by 1.5 seconds after the <code>load</code> event for normal hydration, and finally 2 seconds reserved for HTML capture.</p>
<p>Previously, when using <code>networkidle2</code>, analytics scripts and continuous requests could prevent the page from ever reaching network idle, eventually exhausting the entire budget.</p>
<p>Now, it no longer waits for background network activity to completely quiet down, but it still checks if the rendering result is a challenge, an error page, or a JavaScript shell without main content.</p>
<p>If the fallback still fails, GeoScore will leave the page as <code>unknown</code> or <code>error</code>, and the total score can directly become "insufficient evidence."</p>
<p>2.4.5 also upgraded the audit cache to <code>v24</code>.</p>
<p>This ensures that after deployment, it won't continue to hit old cached timeout or verification page results. Old caches will naturally expire according to their original TTL.</p>
<h2>How to Use the Custom API</h2>
<p>Below the input box on the homepage, there's a custom API panel that's collapsed by default.</p>
<p>This is an optional feature, used only for a single observation of the answer for the Evidence Map after the factual audit is complete.</p>
<p>After filling in the API Key, HTTPS Base URL, and model, you can fetch the model list or directly manually enter a known model.</p>
<p>The Base URL does not need to be manually concatenated with <code>/v1/models</code>.</p>
<p>If I enter <code>https://api.example.com</code>, GeoScore will automatically complete it to <code>https://api.example.com/v1</code>.</p>
<p>If <code>/models</code> or <code>/chat/completions</code> are accidentally pasted along with it, it will also revert to the corresponding API root path before making the request.</p>
<p>All three fields must be filled together; if one is missing, the request cannot be sent.</p>
<p>Before starting the audit, the browser will clear them. They will not be written to browser storage, URL, or downloaded reports.</p>
<p>The server also treats them only as configuration for a single request and will not persist them after the audit is complete.</p>
<p>This does not mean you can display your actual Key in screen recordings or live streams; sensitive information should still be obscured.</p>
<p>After the request is completed, the latest API response will be displayed directly at the top of the Evidence Map.</p>
<p>Here you can see the query, model, status, time, duration, response body, and number of citations. The complete response and citations can be further expanded.</p>
<p>Whether the custom API succeeds or fails, it will not alter the factual score.</p>
<p>I usually save this until after the factual issues have been addressed in a first pass.</p>
<p>First, look at the page's own issues, then external search and response observations. Reversing the order can easily lead you astray by a generated text.</p>
<h2>What's the Point of Monitoring Tokens?</h2>
<p>After creating a monitoring project, you'll get two things: a project ID and a management token.</p>
<p>The project ID identifies the project, and the Token proves you have permission to read the project, modify queries, run snapshots, view history, rotate tokens, or delete the project.</p>
<p>The server only stores protected hashes; the original Token is only displayed once when created or rotated.</p>
<p>So, after getting it the first time, you should copy it to your password manager.</p>
<p>When switching browsers or devices, you can fill in the project ID and Token in "Connect Existing Monitoring Project" to reload queries, history, and project status.</p>
<p>The page does not save the Token by default.</p>
<p>It will only enter the current browser's local storage if you explicitly click "Save to this device," and you can click "Forget this device" at any time.</p>
<p>If the Token appears in screenshots, chat logs, or public logs, rotate it immediately; the old Token will become invalid instantly.</p>
<p>The Docs page provides <code>curl</code> requests that can be directly copied and public API descriptions.</p>
<h2>How Email Monitoring Works</h2>
<p>Monitoring projects can fill in an email address and complete verification.</p>
<p>The system will only attempt to send alerts when a comparable baseline has been established, the scoring version is the same, coverage is sufficient, and the score has actually changed.</p>
<p>The first run, changes in scoring version, or insufficient evidence will only save a snapshot and not generate rise/fall alerts.</p>
<p>The current email adapter prioritizes the main sending channel. In case of authentication, rate limiting, network, or upstream failures, it can switch to the webmaster's own fixed sending service.</p>
<p>Regardless of whether the email is successful, the completed audit snapshot will be saved first.</p>
<h2>Download Full Markdown Repair Report</h2>
<p>After running the audit, you can download the complete Markdown repair report at once, without needing to generate files item by item.</p>
<p>The report will include the site profile, sampled pages, scoring and capping reasons, all failure evidence, unknown and external errors, optional module status, grouped repair tasks, and re-verification steps.</p>
<p>At the end of the report, there's also a handoff prompt for AI development.</p>
<p>It can be given to Codex, Claude, or other coding assistants, but it will require the model to use only existing evidence and not fabricate non-existent prices, services, addresses, entities, authors, or statistical sources.</p>
<p>I usually place this Markdown next to the website's code repository, letting the coding assistant first locate the source file that generates the corresponding URL, then I review the diff myself.</p>
<h2>A Practical Usage Sequence</h2>
<ol>
<li>Open <a href="https://geo.sayori.org">https://geo.sayori.org</a>, and first audit the homepage domain using site mode.</li>
<li>Confirm that the site profile and sampled pages are not off.</li>
<li>If the first screen shows a crawl failure, first look at the page acquisition evidence, don't continue to interpret a non-existent score.</li>
<li>Look at coverage, confidence, and the three priority actions, then decide if the total score has any reference value.</li>
<li>First address critical and major failures, going back to the source file or CMS template of the corresponding page to modify.</li>
<li>For performance issues, separately confirm that both mobile and desktop have real PageSpeed data.</li>
<li>After factual issues are handled, run the Evidence Map or fill in a custom API as needed.</li>
<li>Download the Markdown report, hand it over to a development AI for a second round of localization, then review the changes yourself and deploy.</li>
<li>If continuous observation is needed, create a monitoring project and save the project ID and Token to a password manager.</li>
<li>If unsure about a button or interface, open <a href="https://geo.sayori.org/docs">https://geo.sayori.org/docs</a>.</li>
<li>After deployment, re-audit the same URL to confirm that the failure evidence has truly disappeared.</li>
</ol>
<h2>What It Cannot Do</h2>
<p>GeoScore is not an infinitely deep crawler; five samples cannot represent every URL.</p>
<p>Nor will it replace Search Console, server logs, real user data, or manual content judgment.</p>
<p>For pages blocked by WAF, login walls, verification pages, or regional restrictions, the report may only show <code>unknown</code> or <code>error</code>.</p>
<p>In such cases, security policies should not be disabled just to chase a higher score.</p>
<p>It's even less likely to confirm out of thin air that a certain consumer AI product actually cited your site.</p>
<p>For me, these boundaries actually make the report more useful.</p>
<p>An auditing tool should clearly state what it knows and what it doesn't, leaving the rest for the site maintainer to verify.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tutorial"></category>
  </entry>
  <entry>
    <title>Another Self-Introduction (July 2026)</title>
    <link href="https://blog.sayori.org/en/posts/ziwojieshao/self-introduction/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/ziwojieshao/self-introduction/</id>
    <published>2026-07-13T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>Time to reintroduce myself after a while. After all, a few months ago I didn't know about those communities, nor did I expect to build websites, make videos, or even actually fail a course.</summary>
    <content type="html"><![CDATA[<p>&lt;!--
First draft date: 2026-07-13.
24 hours before publishing, check current Game Jam, video, and project progress. Only modify relevant paragraphs; do not leave outdated "not yet started" or "starting in a few days" remarks.
--&gt;</p>
<p>Recently, I've been preparing my first YouTube self-introduction video. I plan to speak in English, accompanied by some Godot animations, game recordings, and website footage.</p>
<p>But when I started writing the script, I ran into a problem: how exactly should I introduce myself now?</p>
<p>A few months ago, I didn't know about communities like Linux.do, NodeLoc, or Bangumi. I never imagined I'd buy a domain, mess with servers, or set up a blog. And I certainly didn't think I'd actually fail a course this semester.</p>
<p>A few years before that, I probably wouldn't have imagined losing weight, running, working out, then starting to make games, and finally going to learn drawing, music composition, and video editing.</p>
<p>So I think a self-introduction is something that can be rewritten every now and then. People are always changing; I'm not a README that's written once and never updated.</p>
<p>This post only introduces the me of July 2026.</p>
<h2>Let's do this again.</h2>
<p>I'm <code>Amiya_desi</code>, 19 years old, a Digital Media Technology student.</p>
<p>I want to make meta-games. Currently, I mainly use Godot and have completed over a dozen Game Jams, but I'm still looking for that one project I truly want to commit to long-term.</p>
<p>My tech skills aren't top-notch, but I keep building. My drawing is terrible, but I've started. My singing is just okay, but I still dared to sing during military training – that's probably the kind of person I am (Sigh~, whatever, it's out there now, though I have no idea why AI would summarize this bizarre military training singing thing for me).</p>
<p><code>Amiya_desi</code> doesn't have a super cool origin story.</p>
<p><code>Amia</code> was a username I used in games because I liked Akiyama Mizuki, and I also liked his verbal tic <code>desu</code>. My hearing wasn't great, so I misheard both. Then I heard that in the programmer's world, usernames can only consist of uppercase and lowercase letters, numbers, and <code>_</code>. I decided not to randomly add numbers, so I planned to put a <code>_</code> between the two. Now that I think about it, it ended up being snake_case.</p>
<pre><code>Amia + desu + snake_case = Amiya_desi
</code></pre>
<p>It's not proper Japanese, but I've used it for so long that it's just become me.</p>
<h2>Jumping from one pitfall to another.</h2>
<p>When I was 16, I suddenly decided to lose weight after climbing a flight of stairs.</p>
<p>At the time, I had no complete plan, and no one was supervising me daily. I started by controlling my diet and running, and I'd also try climbing stairs. I went from a few laps to 3 km, 5 km, and later even ran 10 km. I lost 50 jin (approx. 55 lbs) in about half a year, then started going to the gym.</p>
<p>The process wasn't very scientific. In the early stages, I only ran, lost a lot of muscle, and my knees felt a bit uncomfortable. At least my weight was eventually controlled, and this experience made me realize for the first time that I really could stick with something.</p>
<p>Later, I used this experience to convince myself to start making games.</p>
<p>As a child, I thought about making indie games because of Undertale, but in middle school, I only dared to write down settings in a notebook. At 17, I finally started watching tutorials, learning Python, installing Godot, and then went from following small game tutorials all the way to participating in Game Jams.</p>
<p>I've done 6 Jams so far. Some projects were decent, some were failures, and for some, I was still messing with AI right before submission, using other tasks to procrastinate. But at least they were all finished and submitted.</p>
<p>The one I'd most like to talk about recently is <a href="https://amiya-desi.itch.io/time-rewind-linker">TimeRewindLinker</a>. I used AI and my own brain to complete the last 11 levels. Of course, it still has many issues, but it's one of the few projects I'm willing to reopen and look at, feeling that coming up with such a mechanic means I'm not too bad (</p>
<p>After making games, things just spiraled.</p>
<p>To make games, I started using AI; to find AI and development resources, I joined various communities; in those communities, I encountered servers, domains, and personal blogs; after setting up a website, I started writing articles, organizing resources, and even created a directory of niche Chinese forums.</p>
<p>And now, I'm preparing to make YouTube videos.</p>
<p>Ultimately, I'm someone who jumps from one pitfall to another. The last one isn't even fully filled yet, and I've already spotted something else interesting nearby.</p>
<h2>Website and AI</h2>
<p>I currently have a personal website called <a href="https://sayori.org/">Amiya's Desk</a>, and a <a href="https://blog.sayori.org/">blog</a> for articles (which is basically here, haha).</p>
<p>It contains my diaries, game logs, technical articles, resources, whiteboards, guestbooks, and many small things I just made on a whim.</p>
<p>A few months ago, I had no idea I'd be doing any of this. Now, the server has hosted search gateways, QQ bots, and some self-hosted tools, and the website has been revamped countless times.</p>
<p>The domain is called <code>sayori.org</code>, and the reason is simple: I played the Sayori route in Blue Skies, and then it spiraled out of control; I fell in love with the character. I wanted to remember her in my own way. For mzk, I chose to remember her with my name and avatar, and for Sayori, I plan to remember her with the domain and a bot, as well as the entire DDLC, haha.</p>
<p>AI is appearing more and more in these things. From initially using it to write code, research information, and organize things, now I also let it help me test character designs and animation keyframes, video creation, art tutorials – basically, I try everything.</p>
<p>However, I don't want to introduce myself as an 'AI tool account.' AI is more like a tool I currently use. Sometimes it's very useful, capable of 'gacha-ing' great ideas and websites. Other times, it can mess up a project completely, and it also turned me into a slave to AI quotas, something I'm only now slowly overcoming.</p>
<p>For example, the first draft of this article was written by AI, but I added a lot of human touches to it, eventually transforming it into something I could bear to look at.</p>
<p>It wrote about me very comprehensively, as if it knew who I was and what I'd do in the future better than I did, with a beautiful conclusion for each paragraph. But I just couldn't stand to read it, so human intervention is still essential.</p>
<h2>Why I want to make YouTube videos now</h2>
<p>Honestly, I don't even know if I'll actually make videos.</p>
<p>My English speaking isn't fluent, the animation workflow isn't smooth yet, so I can only try making things with familiar Godot. Editing is also something I'm learning as I go.</p>
<p>So, for YouTube videos, I guess I'll just try making them this way, with English voiceovers. After all, I think it's more fun this way, and it should definitely be higher quality than my previous Bilibili videos, haha.</p>
<p>The channel should eventually feature Game Jam devlogs, Godot tech experiments, pixel art practice, website and server tinkering, resource sharing, and occasionally self-analysis like this post. And it should all be in English voiceovers.</p>
<p>Then I can also re-upload the YouTube videos to Bilibili, haha. Indeed, this way one piece of work can be published on more platforms.</p>
<h2>Another Introduction Later</h2>
<p>Currently, I like Sayori, Hatsune Miku, 25-ji, Undertale, Re:0. I still really want to make a meta-game that's truly my own. This list will probably only grow, not shrink. The most recent additions are Re:0 and DDLC, from June and April respectively. I'm always moved by these virtual worlds, so I also want to create a world that can move others...</p>
<p>Meanwhile, I'm learning pixel art, trying to make animations with Godot, occasionally dabbling in music composition, continuing to maintain my website, and still battling with my sleep schedule, academics, and a pile of unfinished plans.</p>
<p>Maybe in a few months, there will be new things added here. Maybe I'll finally find a game I want to work on long-term, or maybe I'll just have opened a few more new folders. Perhaps I'll continue to be lost but still exploring.</p>
<p>Then I can write a new self-introduction (laughs). By then, the updated me will surely have more connections and more technical skills.</p>
<p>I once had AI write a sentence, and I still really like it:</p>
<blockquote>
<p>I hope data can fit me, helping me solve things I can't figure out on my own.</p>
</blockquote>
<p>So I'll keep writing, keep doing, and keep leaving all these messy things on the internet.</p>
<ul>
<li>Bilibili: <a href="https://space.bilibili.com/3546919890585725?">Amiya_desi's Personal Space - Amiya_desi's Homepage - Bilibili Videos</a></li>
<li>GitHub: <a href="https://github.com/Amiyadesi">github.com/Amiyadesi</a></li>
<li>Games: <a href="https://amiya-desi.itch.io/">amiya-desi.itch.io</a></li>
</ul>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Log"></category>
  </entry>
  <entry>
    <title>Site Article Index</title>
    <link href="https://blog.sayori.org/en/posts/site-article-index/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/site-article-index/</id>
    <published>2026-07-02T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>A curated list of articles on this site related to website building, servers, AI resources, communities, and creative tools.</summary>
    <content type="html"><![CDATA[<p>This page only lists articles from this site.</p>
<p>&lt;div class="sayori-link-card-grid"&gt;
&lt;a class="sayori-link-card no-styling" href="../webmaster-resource-toolbox/"&gt;
&lt;div class="sayori-link-card-title"&gt;External Webmaster Resources&lt;/div&gt;
&lt;div class="sayori-link-card-desc"&gt;Domains, Hosting, Monitoring, Comments, Blogrolls, Webmaster Community Entry Points&lt;/div&gt;
&lt;/a&gt;
&lt;a class="sayori-link-card no-styling" href="../useful-free-software-toolbox/"&gt;
&lt;div class="sayori-link-card-title"&gt;Common Local Software&lt;/div&gt;
&lt;div class="sayori-link-card-desc"&gt;Remote, Conversion, File Transfer, Notes, Screen Recording, and Pixel Art Software&lt;/div&gt;
&lt;/a&gt;
&lt;a class="sayori-link-card no-styling" href="../useful-browser-extensions-toolbox/"&gt;
&lt;div class="sayori-link-card-title"&gt;Browser Extensions&lt;/div&gt;
&lt;div class="sayori-link-card-desc"&gt;Scripts, Translation, Passwords, Speed Control, Site Lookup, and Privacy Tools&lt;/div&gt;
&lt;/a&gt;
&lt;/div&gt;</p>
<p>&lt;p class="sayori-link-card-hint"&gt;
If you want to see a larger external creative resource library, you can go directly to &lt;a href="/posts/resource-index/"&gt;My Creative Resource Index&lt;/a&gt;
&lt;/p&gt;</p>
<h2>Building a Blog</h2>
<table>
<thead>
<tr>
<th>Article</th>
<th>Content</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/posts/astro-mizuki-blog-from-zero/astro-mizuki-blog-from-zero-en/">Build Your Own Blog from Scratch: GitHub, Cloudflare Pages, Mizuki, and Obsidian</a></td>
<td>Blog repository, Cloudflare Pages, Mizuki, Obsidian writing directory</td>
</tr>
<tr>
<td><a href="/posts/free-domain-and-web-community/free-domain-and-web-community-en/">Get a Free Domain for Your New Blog and Show Up in Webmaster Communities</a></td>
<td>Free domain, Cloudflare DNS, comment system, GoTo, MoeICP, Ten Year Pact, Jiuchan</td>
</tr>
<tr>
<td><a href="/posts/webmaster-resource-toolbox/webmaster-resource-toolbox-en/">webmaster-resource-toolbox</a></td>
<td>External Resource List for Personal Webmasters]]</td>
</tr>
</tbody>
</table>
<h2>Student Resources and AI</h2>
<table>
<thead>
<tr>
<th>Article</th>
<th>Content</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/posts/aliyun-student-300-voucher-guide/aliyun-student-300-voucher-guide-en/">What Can You Buy with Alibaba Cloud's 300 Yuan Student Voucher</a></td>
<td>ECS, Lightweight Server, Wuying, Bailian, and voucher usage</td>
</tr>
<tr>
<td><a href="/posts/anyrouter-sharedchat-cc-switch-student-guide/anyrouter-sharedchat-cc-switch-student-guide-en/">How College Students Can Manage AI Quotas with AnyRouter, SharedChat, and cc-switch</a></td>
<td>Student AI quota and cc-switch configuration</td>
</tr>
<tr>
<td><a href="/posts/freeapi-glm-kimi-cc-switch/freeapi-glm-kimi-cc-switch-en/">Free AI API Backup Entry Points: SenseTime Token Plan and innilove New API</a></td>
<td>Free API claiming and cc-switch configuration</td>
</tr>
<tr>
<td><a href="/posts/edumails-glados-student-benefits/edumails-glados-student-benefits-en/">Student Benefits Navigation: Don't Let Your Educational Email Go to Waste</a></td>
<td>GitHub, JetBrains, Zed, YX Flow, GLaDOS, Alibaba Cloud, and Pages</td>
</tr>
<tr>
<td><a href="/posts/cloudflare-free-tier-student-guide/cloudflare-free-tier-developer-guide/">What Cloudflare's Free Tier Can Do for Developers: The Free Cyber Philanthropist Family Pack</a></td>
<td>Pages, Workers, R2, Tunnel, DNS, and other free tier capabilities</td>
</tr>
</tbody>
</table>
<h2>Student Servers and Self-Hosting</h2>
<table>
<thead>
<tr>
<th>Article</th>
<th>Content</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/posts/sayori-server-01-vps-start/sayori-server-01-vps-start-en/">I Just Wanted My Bot Online 24/7, Ended Up Buying a Cloud Server</a></td>
<td>First VPS, SSH, security groups, and basic configuration</td>
</tr>
<tr>
<td><a href="/posts/docker-compose-minimum-start/docker-compose-minimum-start-en/">Minimal Introduction to Docker and Docker Compose: Understanding Those YML Files</a></td>
<td>Minimal Docker Compose concepts</td>
</tr>
<tr>
<td><a href="/posts/student-2c2g-server-service-index/2c2g-server-service-index/">What Can a 2C2G Student Server Run: Don't Overload the Small Machine Yet</a></td>
<td>2C2G small server service selection</td>
</tr>
<tr>
<td><a href="/posts/selfhost-vaultwarden-on-2c2g/selfhost-vaultwarden-on-2c2g-en/">Setting Up Vaultwarden on a 2C2G Student Server: Don't Let Your Password Vault Run Naked</a></td>
<td>Self-hosted password vault</td>
</tr>
<tr>
<td><a href="/posts/fast-note-sync-on-student-server/fast-note-sync-on-student-server-en/">Tinkering with Fast Note Sync on a Student Server: Giving Obsidian a Private Sync Layer</a></td>
<td>Obsidian private sync</td>
</tr>
</tbody>
</table>
<h2>Communities and Resources</h2>
<table>
<thead>
<tr>
<th>Article</th>
<th>Content</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/posts/internet-community-1/internet-community-1-en/">Internet Community Records 1: Starting with Linux.do and NodeLoc</a></td>
<td>Linux.do, NodeLoc, and hosting community entry points</td>
</tr>
<tr>
<td><a href="/posts/cn-internet-community-map/internet-community-map/">我做了一个小型论坛列表仓库</a></td>
<td>Small forum list repository and community index</td>
</tr>
<tr>
<td><a href="/posts/resource-index/resource-index-en/">My Creative Resource Index</a></td>
<td>Game development, assets, art, music, AI, and learning resources</td>
</tr>
<tr>
<td><a href="/posts/useful-free-software-toolbox/useful-free-software-toolbox-en/">List of Free and Useful Software: Remote, Conversion, File Transfer, Notes, Screen Recording, and Pixel Art</a></td>
<td>Common software and download entry points</td>
</tr>
<tr>
<td><a href="/posts/useful-browser-extensions-toolbox/useful-browser-extensions-toolbox-en/">List of Free and Useful Browser Extensions: Scripts, Translation, Passwords, Speed Control, Site Lookup, and Privacy</a></td>
<td>Browser extensions, Tampermonkey scripts, and privacy tools</td>
</tr>
</tbody>
</table>
<h2>Creation and Gaming</h2>
<table>
<thead>
<tr>
<th>Article</th>
<th>Content</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="/posts/godot-useful-plugins/godot-useful-plugins-en/">Useful Godot Plugins</a></td>
<td>Useful Godot development plugins</td>
</tr>
</tbody>
</table>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>List of Free and Useful Browser Extensions: Scripts, Translation, Passwords, Speed Control, Site Discovery, and Privacy</title>
    <link href="https://blog.sayori.org/en/posts/useful-browser-extensions-toolbox/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/useful-browser-extensions-toolbox/</id>
    <published>2026-07-02T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>A brief compilation of Tampermonkey scripts, Immersive Translate, Bitwarden, Global Speed, SimilarSites, AI assistant extensions, and privacy extensions.</summary>
    <content type="html"><![CDATA[<p>This post only lists browser extensions and script entry points.</p>
<p>For commonly used software, see <a href="/posts/useful-free-software-toolbox/useful-free-software-toolbox-en/">List of Free and Useful Software</a>.</p>
<p>For related articles on this site, see <a href="/posts/site-article-index/site-article-index-en/">Site Article Index</a>.</p>
<h1>What are Extensions?</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/0c79fcbac2c6feb97fddc65d3d829a37bba557f082a57eaa79dc62e356548c85/443.webp" alt="Browser Extension Entry Point" loading="lazy" width="560" height="88" decoding="async" /&gt;
&lt;figcaption&gt;Browser Extension Entry Point&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>Clicking the puzzle piece on the right takes you to the extension store for downloads. Browser extensions are basically extra scripts injected into pages, so they can do a lot. That's why it's best not to download extensions from unknown sources; try to stick to more reputable ones. The ones in the store are usually sufficient.</p>
<h1>AdGuard</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 520px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/fec06b0d6d2a33bc5b9ccd998b58650a153c5b9d366c7164fe329507821802b5/567.webp" alt="AdGuard Extension Panel" loading="lazy" width="520" height="961" decoding="async" /&gt;
&lt;figcaption&gt;AdGuard Extension Panel&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>Downloadable from the official extension store, this is a super useful ad-blocking extension, practically a browser essential. Once downloaded, you can pretty much just leave it on.</p>
<h1>Tampermonkey</h1>
<p>Tampermonkey scripts, famous as they are, probably need no introduction. They're like custom extensions within extensions. <a href="https://www.youxiaohou.com/">https://www.youxiaohou.com/</a> is a recommended site where you can download various scripts and more. Here's one I use quite often: <a href="https://github.com/hmjz100/LinkSwift">hmjz100/LinkSwift: A JavaScript-based tool for obtaining cloud drive file download links. Modified from [Cloud Drive Direct Link Download Assistant], supports Baidu Netdisk / Alibaba Cloud Drive / China Mobile Cloud Drive / Tianyi Cloud Drive / Xunlei Cloud Drive / Quark Cloud Drive / UC Cloud Drive / 123 Cloud Drive, eight major cloud drives</a>. There are also all sorts of other convenient scripts. And as a student, there's a lot you can do with this, but I won't go into details, hehe.</p>
<h1><s>Immersive Translate</s> — Peiduwa 🐸</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/89417f2ed903635ad5fb224abab0325789ec0ba4c74f1f828945542a0a6df366/213.webp" alt="Peiduwa Extension" loading="lazy" width="560" height="663" decoding="async" /&gt;
&lt;figcaption&gt;Peiduwa Extension&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>You can find it in the extension store. It's really comfortable for bilingual translation, and the built-in free features are pretty good. If you have higher demands, you can top up some DeepSeek and use DeepSeek v4 Flash for translation, which should last a long time. Or you can look for some public DeepSeek sites, like the ones mentioned in my article <a href="/posts/freeapi-glm-kimi-cc-switch/freeapi-glm-kimi-cc-switch-en/">Some Current Free APIs</a>.</p>
<p>I recently tried Peiduwa and realized translation could be this fast! Immersive Translate, who are you? I don't know you. Don't disturb me and Peiduwa living our lives.</p>
<h1>Bitwarden</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/384c5ce0d55655af565da253b73616b2ce026e66e88e8fad19bcc6f60b50c07c/840.webp" alt="Bitwarden Extension" loading="lazy" width="560" height="688" srcset="https://img.sayori.org/blog/v1/384c5ce0d55655af565da253b73616b2ce026e66e88e8fad19bcc6f60b50c07c/640.webp 640w, https://img.sayori.org/blog/v1/384c5ce0d55655af565da253b73616b2ce026e66e88e8fad19bcc6f60b50c07c/840.webp 840w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;Bitwarden Extension&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>Also found in the extension store, its built-in features allow you to save identities, bank cards, password accounts, and passkeys, and it can autofill them. It's practically essential for anyone navigating the internet. The sooner you start using it, the better; once you do, you won't be able to live without it. For advanced 2FA storage, I recommend self-hosting a Vaultwarden <a href="/posts/selfhost-vaultwarden-on-2c2g/selfhost-vaultwarden-on-2c2g-en/">Self-hosting a Vaultwarden</a>, or finding one, for example, the organization <a href="/posts/disroot-open-services-note/disroot-open-services-note-en/">Disroot Introduction</a> offers a free Vaultwarden.</p>
<h1>GlobalSpeed</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/d28024c4c298d5f7980413adffeda120724b4853c9d7dafc63b7010c5ec59ca8/531.webp" alt="GlobalSpeed Extension" loading="lazy" width="560" height="391" decoding="async" /&gt;
&lt;figcaption&gt;GlobalSpeed Extension&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>Also found in the extension store, it conveniently adjusts playback speed. <s>Super useful for cramming courses (kidding)</s></p>
<h1>SimilarSites</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/25515eb73fbe1f7a7221cee810a419f5a8fe9ac1425ccf2036d18172c9a56ed2/924.webp" alt="SimilarSites Extension" loading="lazy" width="560" height="973" srcset="https://img.sayori.org/blog/v1/25515eb73fbe1f7a7221cee810a419f5a8fe9ac1425ccf2036d18172c9a56ed2/640.webp 640w, https://img.sayori.org/blog/v1/25515eb73fbe1f7a7221cee810a419f5a8fe9ac1425ccf2036d18172c9a56ed2/924.webp 924w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;SimilarSites Extension&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p><a href="https://www.similarsites.com/">Similarsites.com - Easily Explore alternative websites</a>, you can download it here.
Taking Youxiaohou as an example, you can use this extension to explore more similar and interesting websites, helping you find resources and explore the internet more effectively.</p>
<h1>WebRTC Control</h1>
<p>&lt;div class="sayori-photo-grid" style="--photo-grid-columns: 2;"&gt;
&lt;figure class="sayori-photo-grid-item"&gt;
&lt;img src="https://img.sayori.org/blog/v1/166ebf589e8eaca0684c189a9b760d8a7c8243c7c97cb426d4c5fc30c2ab47d7/268.webp" alt="Active State" loading="lazy" width="268" height="71" decoding="async" /&gt;
&lt;figcaption&gt;Active State&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class="sayori-photo-grid-item"&gt;
&lt;img src="https://img.sayori.org/blog/v1/762b25923bf2664474eb55330f172f5c36a7e552038c2e1573c5ee5dc206fa46/310.webp" alt="Inactive State" loading="lazy" width="310" height="81" decoding="async" /&gt;
&lt;figcaption&gt;Inactive State&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/div&gt;</p>
<p><s>Essential for going abroad</s>, it helps you hide your real IP address, and it's easy to toggle on/off; just click it to disable.</p>
<h1>ALL API HUB</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/b76b5627214143bafa2d89b25ac1960cd1aeb5d91ff1bba31b1e8d159ae225e6/586.webp" alt="ALL API HUB Extension" loading="lazy" width="560" height="786" decoding="async" /&gt;
&lt;figcaption&gt;ALL API HUB Extension&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>Aggregates new-API sites and offers automatic check-ins and balance statistics. Finally, no more tedious daily check-ins!</p>
<h1>Superpower Chatgpt</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 560px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/ef257949c91f06277c6c5983161a156ca08d4806d4f41c484682d59ef2a56300/1280.webp" alt="Superpower ChatGPT Extension" loading="lazy" width="560" height="394" srcset="https://img.sayori.org/blog/v1/ef257949c91f06277c6c5983161a156ca08d4806d4f41c484682d59ef2a56300/640.webp 640w, https://img.sayori.org/blog/v1/ef257949c91f06277c6c5983161a156ca08d4806d4f41c484682d59ef2a56300/1280.webp 1280w, https://img.sayori.org/blog/v1/ef257949c91f06277c6c5983161a156ca08d4806d4f41c484682d59ef2a56300/1872.webp 1872w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;Superpower ChatGPT Extension&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p><a href="https://spchatgpt.com/">https://spchatgpt.com/</a>, the website is here. After installing this, you can use Enter for new lines and Ctrl+Enter to send! It also enables an advanced model switcher for custom models, and includes common features like chat export, categorization, and prompt saving.</p>
<h1>Voyager</h1>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 480px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/ee8011d17e304e180d0837cdee80cf0d126ec6e94f9a4952c60c632b0c07da15/632.webp" alt="Voyager Extension" loading="lazy" width="480" height="801" decoding="async" /&gt;
&lt;figcaption&gt;Voyager Extension&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>Similar to the one above, this is the Gemini version, also supporting many features and very useful.</p>
<h1>End</h1>
<p>That's all for now. If I find other useful extensions in the future, I'll update them here. It would be my honor if this helped you (≧∇≦)/</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>Student Benefits Navigation: Don't Let Your Edu-Email Sit Idle</title>
    <link href="https://blog.sayori.org/en/posts/edumails-glados-student-benefits/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/edumails-glados-student-benefits/</id>
    <published>2026-06-27T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>I'll start with GitHub, JetBrains, and Zed, then use YX Flow, GLaDOS, Aliyun, and Pages as needed.</summary>
    <content type="html"><![CDATA[<p>Don't just use your edu-email for school notifications.</p>
<p>My own order is simple: first apply for long-term useful stuff like GitHub and JetBrains, then look into AI, networking, and servers.</p>
<p>Here's an overview compiled by someone else <a href="https://nav.edumails.cn">https://nav.edumails.cn</a> that you can check out. Below are the resources I've claimed.</p>
<h2>Grab Developer Tools First</h2>
<p><a href="https://education.github.com/pack">GitHub Student Developer Pack</a> comes first.</p>
<p>Once verified, you get GitHub Pro and a bunch of partner benefits. Just log into your Pack page to see them.</p>
<p><a href="https://www.jetbrains.com/community/education/#students">JetBrains Student License</a> If you want to try out JetBrains' products, you can also use your edu-email to register.</p>
<p><a href="https://zed.dev/education">Zed Education</a> I also applied for this and got a one-year Student plan, with $10 in Agent tokens, plus unlimited edit prediction.</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 420px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/b25f8015747d38bb5062e4e84e3278c78aebf4b906b90eb83c3c595cdc595775/949.webp" alt="The Student prompt I saw after my application was approved" loading="lazy" width="420" height="727" srcset="https://img.sayori.org/blog/v1/b25f8015747d38bb5062e4e84e3278c78aebf4b906b90eb83c3c595cdc595775/640.webp 640w, https://img.sayori.org/blog/v1/b25f8015747d38bb5062e4e84e3278c78aebf4b906b90eb83c3c595cdc595775/949.webp 949w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;The Student prompt I saw after my application was approved&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>It's not the full Pro version; Claude Opus is not included.</p>
<p>For Zed, there are two conditions: your GitHub account must be older than 30 days, and your school email domain must be in <a href="https://github.com/JetBrains/swot">JetBrains/swot</a>.</p>
<h2>YX Flow's Actual Free Quota</h2>
<p><a href="https://chatgpt.yxflow.xyz/pastel#/register?i=vOBIZ">YX Flow Registration Link</a></p>
<p>This is a shared AI web client project.</p>
<p>After registering with my <code>.edu.cn</code> email, the backend only gave me two new user trials.</p>
<p>As of July 11, 2026, the page shows ChatGPT Max with 40 uses/3 hours, and Grok Plus with 10 uses/hour, both expiring at 23:11 on the same day.</p>
<p>&lt;figure class="sayori-figure sayori-figure--center" style="--sayori-image-width: 760px;"&gt;
&lt;img src="https://img.sayori.org/blog/v1/dec7b1d92fc504ffd8b808d5349c1052d9ce3068d89d74c47792ec63dec70565/1280.webp" alt="Two free trials actually displayed in the backend after new account registration" loading="lazy" width="760" height="224" srcset="https://img.sayori.org/blog/v1/dec7b1d92fc504ffd8b808d5349c1052d9ce3068d89d74c47792ec63dec70565/640.webp 640w, https://img.sayori.org/blog/v1/dec7b1d92fc504ffd8b808d5349c1052d9ce3068d89d74c47792ec63dec70565/1280.webp 1280w, https://img.sayori.org/blog/v1/dec7b1d92fc504ffd8b808d5349c1052d9ce3068d89d74c47792ec63dec70565/1920.webp 1920w" sizes="(max-width: 768px) 100vw, 46rem" decoding="async" /&gt;
&lt;figcaption&gt;Two free trials actually displayed in the backend after new account registration&lt;/figcaption&gt;
&lt;/figure&gt;</p>
<p>If you want to use the API to connect your own tools, you can check out <a href="/posts/freeapi-glm-kimi-cc-switch/freeapi-glm-kimi-cc-switch-en/">Free AI API Entry Points and Navigation</a>.</p>
<h2>Networking and Servers</h2>
<p><a href="https://glados.space/register">GLaDOS</a>'s <a href="https://glados.one/console/education">Education Portal</a></p>
<p>GLaDOS Education offers:</p>
<ol>
<li>If you are a high school to university student or teacher (China), you can get a free 360-day GLaDOS Education Plan.</li>
<li>If you are a medical school student or teacher (China), you can get a free 360-day GLaDOS Pro Plan.</li>
<li>If you are a student outside mainland China, you can get a free 14-day GLaDOS Education Plan (edu.kg also works).</li>
<li>This is a one-time offer.</li>
<li>Supports 3 active devices, up to 100GB traffic per month, uses economic servers (not optimized for streaming content), does not support Netflix unlocking, and does not support advanced features.</li>
</ol>
<p>You can use this invitation code to register: <code>JZELF-GSULR-G5LFS-BD1S4</code></p>
<p>If you do pay, you can use my discount code <code>AMIYADESI</code> at checkout for a 10% discount when paying with Alipay.</p>
<p><a href="https://university.aliyun.com/course/promotion25-activity?clubTaskBiz=subTask..12655012..10273..&amp;userCode=gv5jbukv">Aliyun Student Portal</a>'s 300 RMB voucher is not cash, nor can it be used for all products.</p>
<p>If you want to buy ECS, Light Application Server, Baolian API, or Wuying, add them to your cart first and check the settlement page.</p>
<p>My actual pitfalls and several optional directions are written in <a href="/posts/aliyun-student-300-voucher-guide/aliyun-student-300-voucher-guide-en/">What You Can Buy with Aliyun Student's 300 RMB Voucher</a>.</p>
<p>If your website is just for course projects, documentation, or portfolios, start with <a href="https://pages.github.com/">GitHub Pages</a> or <a href="https://pages.cloudflare.com/">Cloudflare Pages</a>. Only touch servers when those aren't enough.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>Get a Free Domain for Your New Blog, Then Show Up in Webmaster Communities</title>
    <link href="https://blog.sayori.org/en/posts/free-domain-and-web-community/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/free-domain-and-web-community/</id>
    <published>2026-06-22T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>From DNSHE free subdomains and Cloudflare DNS to comment systems, Travellings, Moe ICP, and Forever Blog, giving your freshly set up blog a domain, interaction, and a little chance to be seen.</summary>
    <content type="html"><![CDATA[<p>The last post covered how to set up your own blog using GitHub, Cloudflare Pages, Mizuki, and Obsidian.</p>
<p>After setting it up, the default address probably looks something like this:</p>
<pre><code>https://你的项目名.pages.dev
</code></pre>
<p>It works, but it still feels like something's missing.</p>
<p>Now that you have a blog, the natural next step is to give it a proper domain and then show up in some webmaster communities. It's not about getting immediate traffic, but about transforming this website from "a project on my computer" into "a small place with a name on the internet."</p>
<h2>Free Domains Are Good Enough for Now</h2>
<p>If you don't want to buy a domain just yet, you can start with a free subdomain to get some practice.</p>
<p>I currently recommend services like DNSHE:</p>
<p><a href="https://my.dnshe.com/">https://my.dnshe.com/</a></p>
<p><img src="https://img.sayori.org/blog/v1/2e358c38fe6fc0a249b82a127b60188403c355ea80ebd6ba01f306e8d6ac6f3e/408.webp" alt="Pasted image 20260623151351.png" /></p>
<p>I currently prioritize suffixes like <code>cc.cd</code> that can be integrated with Cloudflare.</p>
<p><img src="https://img.sayori.org/blog/v1/5a83eeb11644af9a1df3e3567baf0b7a38d7bde7ec9db2874537043735808458/725.webp" alt="Pasted image 20260622231201.png" /></p>
<p>Free domains are suitable for these things:</p>
<ul>
<li>Binding a custom domain to a Cloudflare Pages blog</li>
<li>Learning DNS resolution</li>
<li>Learning Cloudflare hosting</li>
<li>Preparing subdomains for future self-hosted services</li>
</ul>
<p>They are not suitable for these things:</p>
<ul>
<li>Long-term commercial projects</li>
<li>Main domain for important email</li>
<li>Brand entry point you can't afford to lose</li>
<li>Projects where you're completely unwilling to bear the risk of rule changes</li>
</ul>
<h2>DNSHE Boost Codes</h2>
<p>DNSHE has a boosting mechanism where you can help each other to get longer-term subdomains.</p>
<p>I'll put a few boost codes here for now, and add more if I get new ones later:</p>
<pre><code>VJC8UQYTPK
GHGMEUGWXA
VVN9QFPEUL
UUJ22RXYDC
G4HPCNW7R4
</code></pre>
<p>If you're just testing a blog temporarily, you don't necessarily need to aim for permanence. It's more important to get a resolvable domain and get the process working.</p>
<h2>Connect to Cloudflare</h2>
<p>After getting the domain, the next step is to connect it to Cloudflare.</p>
<p>The most common process is:</p>
<ol>
<li>Add the site in Cloudflare</li>
<li>Change the domain's NS to Cloudflare as prompted</li>
<li>Wait for DNS to take effect</li>
<li>Add a custom domain in your Cloudflare Pages project</li>
<li>Add CNAME records as prompted by Pages or let Cloudflare configure automatically</li>
</ol>
<p>If you're using a free subdomain, you need to first confirm if it supports changing NS. If you can't change NS, you'll either have to add resolution records on the original platform or switch to a suffix that's more suitable for Cloudflare.</p>
<p>Don't rush here; DNS propagation can sometimes take a while. First, make sure you know exactly where your root domain and <code>www</code> / subdomain should point, and don't forget what you just entered while making changes.</p>
<h2>Reserve Subdomains for Self-Hosted Services</h2>
<p>Later, if you have a 2C2G student server, you can plan subdomains in advance:</p>
<pre><code>vault.example.cc.cd  -&gt; Vaultwarden
notes.example.cc.cd  -&gt; Fast Note Sync
ntfy.example.cc.cd   -&gt; ntfy
status.example.cc.cd -&gt; Gatus
</code></pre>
<p>Don't cram all services under the root domain.</p>
<p>Domains are like house numbers. Clear house numbers make moving, migrating, reverse proxying, and shutting down services a bit smoother later on.</p>
<p>For server services, you can check this overview:</p>
<p><a href="/posts/student-2c2g-server-service-index/2c2g-server-service-index/">What a 2C2G Student Server Can Run: Don't Overload Your Little Machine Yet</a></p>
<h2>How to Choose Between Free and Formal Domains</h2>
<p>I'd categorize them like this:</p>
<p>Free domains are suitable for:</p>
<ul>
<li>Just setting up a blog</li>
<li>Learning DNS</li>
<li>Creating tutorials</li>
<li>Testing Cloudflare Pages</li>
<li>Trying out self-hosted services</li>
</ul>
<p>Formal domains are suitable for:</p>
<ul>
<li>Long-term maintained blogs</li>
<li>Setting up a formal email</li>
<li>Putting the address on avatars, business cards, video descriptions</li>
</ul>
<p>It's not that free domains are inferior. It's just that for long-term projects, the biggest fear is "migration will be a pain later."</p>
<p>If you've decided this blog is for the long haul, then buying a domain you like is well worth it. Personal projects allow for a bit of whimsy; if you like the name, you'll be more motivated to maintain it.</p>
<h1>Engaging with Webmaster Communities</h1>
<p>Once your domain is set up, you can check out some webmaster communities.</p>
<p>It's not about aggressively advertising, but about immersing yourself in an environment where people are still blogging. The biggest fear for an independent blog is becoming a solo diary. Occasionally seeing how others write, decorate, and interlink can be very motivating.</p>
<h2>Travellings</h2>
<p>Travellings is a blogroll relay project:</p>
<p><a href="https://www.travellings.cn/">https://www.travellings.cn/</a></p>
<p>Its gameplay is quite charming. You place a "Travellings" entry on your website, and visitors who click it will randomly jump to another independent site participating in the project.</p>
<p>Joining instructions:</p>
<p><a href="https://www.travellings.cn/docs/join.html">https://www.travellings.cn/docs/join.html</a></p>
<p>Suitable for blogs that already have some content.</p>
<p>Don't apply right after building it with an empty homepage. Write a few articles first so people actually have something to read when they click through.</p>
<h2>Moe ICP</h2>
<p>Moe ICP is the Moe Country ICP Filing:</p>
<p><a href="https://icp.gov.moe/">https://icp.gov.moe/</a></p>
<p>Application page:</p>
<p><a href="https://icp.gov.moe/join.php">https://icp.gov.moe/join.php</a></p>
<p>This isn't an MIIT filing, don't misunderstand. It's more like a fun identifier and community entry point among ACG/personal websites.</p>
<p>The official application page has content requirements, such as being non-commercial, non-gray area, not an empty shell, enabling HTTPS, and being accessible long-term.</p>
<p>If your site's style is suitable, you can apply for a Moe ICP number and place it in the footer. It doesn't have any practical necessity, but it has a strong independent website vibe.</p>
<h2>Forever Blog</h2>
<p>Forever Blog:</p>
<p><a href="https://www.foreverblog.cn/">https://www.foreverblog.cn/</a></p>
<p>Its core is a pact: from the moment you join, your blog won't shut down for ten years or more, maintaining updates and vitality.</p>
<p>It sounds a bit chuunibyou, but I quite like the idea.</p>
<p>However, this requires one year of operation before you can apply, so just wait for now. Of course, if your site has been running for a year, then you can definitely give it a try, haha.</p>
<h2>Jiuchan</h2>
<p>Jiuchan:</p>
<p><a href="https://hi.jiuchan.org/docs">https://hi.jiuchan.org/docs</a></p>
<p>It's a personal website indexing and random access platform, somewhat like putting independent sites into a "random discovery" entry.</p>
<p>If your blog already has a few readable articles, you can check out its inclusion documentation. For new sites, the significance of these platforms isn't about immediately bringing in a lot of traffic, but about giving others a chance to jump from one site to another and gradually discover you.</p>
<h1>BlogFinder</h1>
<p><a href="https://bf.zzxworld.com/">BlogFinder - Discover Excellent Personal Blogs</a></p>
<h2>Chinese Independent Blogs List</h2>
<p>GitHub：<a href="https://github.com/timqian/chinese-independent-blogs">https://github.com/timqian/chinese-independent-blogs</a></p>
<p>This repository collects Chinese independent blogs. It's more like a long-term maintained blog index, including blog addresses, RSS, descriptions, and tags.</p>
<p>Who it's suitable for:</p>
<ul>
<li>Those with a stable blog</li>
<li>Those with RSS</li>
<li>Content is primarily self-written</li>
<li>Willing to be publicly indexed</li>
</ul>
<p>Many people no longer actively subscribe to blogs; information is now queued and distributed by platforms. The Chinese Independent Blogs List at least preserves an old but effective method: subscribe to whoever you like.</p>
<p>If you want to submit your site, make sure these are filled out:</p>
<pre><code>Site Name
Site URL
RSS URL
One-sentence description
Topic tags
</code></pre>
<h1>Other Free Domain Options</h1>
<p>DNSHE isn't the only option. Here are a few others I've seen:</p>
<p><a href="https://www.nodeloc.com/t/topic/70964?u=amiya_desi"> Collection of Free Domains Available for Registration and CF Hosting</a></p>
<p><a href="https://domain.stackryze.com/">https://domain.stackryze.com/</a> Friendly reminder, you can register four domains, currently only .in and .cc can be hosted by CF.</p>
<p>A little treasure post from nodeloc, it gathers quite a few.</p>
<h3>GitHub Pages' Own Domain</h3>
<p>If you don't want to bother with any domain services for now, GitHub Pages itself gives you one:</p>
<pre><code>你的用户名.github.io
</code></pre>
<p>Cloudflare Pages also provides one:</p>
<pre><code>你的项目名.pages.dev
</code></pre>
<p>Strictly speaking, these aren't "your domains," but they're sufficient for blogging and showcasing projects. It's not too late to buy a formal domain once you've thought it through.</p>
<h2>Add a Comment System to Your Blog</h2>
<p>The last post mentioned covering comment systems, so here it is.</p>
<p>A blog can survive without a comment section, but if you're writing tutorials, experiences, or troubleshooting logs, occasionally receiving a "this helped me" or "I encountered a different issue in step three" can foster communication and your learning, and having a comment section makes it easier to get feedback compared to email contact or similar methods.</p>
<p>Here are a few comment systems I've seen that are quite suitable for personal static blogs:</p>
<h3>Twikoo</h3>
<p><a href="https://twikoo.js.org/">https://twikoo.js.org/</a></p>
<p>GitHub：<a href="https://github.com/twikoojs/twikoo">https://github.com/twikoojs/twikoo</a></p>
<p>Twikoo is a widely used comment system in the Chinese independent blogosphere. It supports anonymous comments, email notifications, emojis, and an admin panel.</p>
<p>There are many deployment methods: Vercel, Netlify, cloud functions, self-hosted Docker. For students, free deployment on Vercel is the most hassle-free route.</p>
<p>Pros:</p>
<ul>
<li>Chinese ecosystem, friendly documentation</li>
<li>Deployment cost can be zero</li>
<li>Admin panel for reviewing, deleting, replying</li>
<li>Supports email and WeChat notifications</li>
</ul>
<p>Cons:</p>
<ul>
<li>You need to choose a database backend (MongoDB Atlas free tier, or Vercel KV, or self-hosted)</li>
<li>If using a third-party free database, your data isn't entirely in your hands</li>
</ul>
<h3>Giscus</h3>
<p><a href="https://giscus.app/">https://giscus.app/</a></p>
<p>GitHub：<a href="https://github.com/giscus/giscus">https://github.com/giscus/giscus</a></p>
<p>Giscus uses GitHub Discussions as its comment backend. Visitors can only comment after logging in with a GitHub account.</p>
<p>Pros:</p>
<ul>
<li>Data is stored in your own GitHub repository</li>
<li>No extra deployment needed</li>
<li>Suitable for tech blogs, readers are likely to have GitHub accounts</li>
<li>Native support for Markdown format and code highlighting</li>
</ul>
<p>Cons:</p>
<ul>
<li>Requires GitHub login</li>
<li>Non-tech readers might be unwilling to register for GitHub just to leave a comment</li>
<li>Comments are tied to your repository; changing repositories requires migration</li>
</ul>
<h3>Artalk</h3>
<p><a href="https://artalk.js.org/">https://artalk.js.org/</a></p>
<p>GitHub：<a href="https://github.com/ArtalkJS/Artalk">https://github.com/ArtalkJS/Artalk</a></p>
<p>Artalk is a self-hosted comment system that requires running a backend service. If you already have a 2C2G server, you can run it with Docker.</p>
<p>Pros:</p>
<ul>
<li>Complete control over your data</li>
<li>Supports multi-site management</li>
<li>Feature-rich: email notifications, Telegram notifications, CAPTCHA, admin panel</li>
</ul>
<p>Cons:</p>
<ul>
<li>You need a server</li>
<li>One more service to maintain, back up, and update</li>
<li>Running one more service on a 2C2G server means you need to watch the memory</li>
</ul>
<h3>How I'd Choose</h3>
<p>If you've just set up your blog and don't have a server, I recommend trying Giscus or Twikoo (Vercel deployment) first.</p>
<p>If you already have a server and your readers aren't all programmers, you might want to look at Artalk.</p>
<p>If you don't want to bother with comments for now, that's perfectly fine too. Write your articles first; you can always add comments later when you have readers. A comment system isn't the core of a blog; content is.</p>
<h2>Other Places to Put Links</h2>
<ul>
<li>Friends page: find bloggers with similar topics to exchange links</li>
<li>GitHub Profile: put your blog on your personal homepage</li>
<li>Bilibili / YouTube / Xiaohongshu bio: tutorial videos with article links</li>
<li>Linux DO / V2EX and other forum signatures: follow community rules, don't spam</li>
<li>Open-source project README: if the project is related to your blog, you can include documentation links</li>
</ul>
<p>Opening up more entry points for your website will naturally lead to more visitors.</p>
<h2>Blog Data: Knowing If Anyone's Visited</h2>
<p>After adding a domain and community entries, you might start wondering: is anyone actually reading my blog?</p>
<p>A few lightweight alternatives:</p>
<ul>
<li><strong>Umami</strong>：<a href="https://umami.is/">https://umami.is/</a>, you can self-host or use the official free version. Clean interface, data under your control.</li>
<li><strong>Cloudflare Web Analytics</strong>：If you're already using Cloudflare, its built-in Web Analytics is free and requires no extra code; you can just check it in the Dashboard.</li>
<li><strong>Plausible</strong>：<a href="https://plausible.io/">https://plausible.io/</a>, primarily paid but can be self-hosted.</li>
<li><strong>No analytics at all</strong>：That's fine too. A personal blog isn't a commercial website; it can survive without looking at data.</li>
</ul>
<p>My current recommendation is to start with Cloudflare Web Analytics (since you've likely already connected to Cloudflare), and then consider Umami if you feel it's not enough someday.</p>
<p>Don't stare at the numbers every day. Writing is more useful than looking at data.</p>
<h2>Finally</h2>
<p>Don't rush to pursue perfection with a freshly set up blog.</p>
<p>If a free domain works, use it for now. If Cloudflare can resolve, get it running. If you can join a community, apply gradually. It's not too late to add a comment system later.</p>
<p>What's truly important is to keep writing.</p>
<p>Domains, ICP numbers, friend links, Travellings buttons, comment boxes—these are all little decorations that make a blog feel more like a "site." The articles are the reason it stands.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building & Self-Hosting"></category>
  </entry>
  <entry>
    <title>Running ntfy on a 2C2G Student Server: Giving Myself a Notification Button</title>
    <link href="https://blog.sayori.org/en/posts/selfhost-ntfy-on-2c2g/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/selfhost-ntfy-on-2c2g/</id>
    <published>2026-06-22T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>Deploy ntfy push service with Docker on a student server, so backup scripts, monitoring, and scheduled tasks can all send notifications to your phone.</summary>
    <content type="html"><![CDATA[<p>ntfy is one of the most inconspicuous yet useful services on my server.</p>
<p>It does something very simple: you send it a message via an HTTP request, and it pushes that message to your phone.</p>
<p>No complex configuration interface, no fancy dashboards. Just a push pipeline.</p>
<p>But this pipeline has more uses than you might imagine:</p>
<ul>
<li>Backup script finished, tells you if it succeeded or failed.</li>
<li>Server cost alert triggered, notifies you to check it out.</li>
<li>Scheduled task failed, sends you a push.</li>
<li>Gatus monitoring found a service down, notifies you.</li>
<li>Certificate is about to expire, reminds you.</li>
<li>You can also customize some commands to send for remote, temporary control.</li>
</ul>
<p>Official project:</p>
<p><a href="https://github.com/binwiederhier/ntfy">https://github.com/binwiederhier/ntfy</a></p>
<p>Official documentation:</p>
<p><a href="https://docs.ntfy.sh/">https://docs.ntfy.sh/</a></p>
<h2>Why Self-Host?</h2>
<p>ntfy has an official public server, <code>ntfy.sh</code>, which you can use without installing anything.</p>
<p>But I still chose to self-host, because:</p>
<ul>
<li>Topics on the public server are public. Anyone who knows your topic name can send messages to it.</li>
<li>Self-hosting allows for user authentication.</li>
<li>Self-hosting allows control over retention and logs.</li>
<li>My student server has space anyway, and ntfy is very lightweight.</li>
</ul>
<p>If you're just trying it out temporarily, using the public <code>ntfy.sh</code> is perfectly fine. But for long-term use, self-hosting is more reliable.</p>
<h2>Deployment</h2>
<p>Prepare the directory:</p>
<pre><code>sudo mkdir -p /srv/stacks/ntfy
sudo chown -R $USER:$USER /srv/stacks/ntfy
cd /srv/stacks/ntfy
</code></pre>
<p>Write <code>docker-compose.yml</code>:</p>
<pre><code>services:
  ntfy:
    image: binwiederhier/ntfy
    container_name: ntfy
    restart: unless-stopped
    command: serve
    environment:
      TZ: Asia/Shanghai
      NTFY_BASE_URL: "https://ntfy.example.com"
      NTFY_AUTH_DEFAULT_ACCESS: "deny-all"
    volumes:
      - ./cache:/var/cache/ntfy
      - ./data:/var/lib/ntfy
      - ./etc:/etc/ntfy
    ports:
      - "127.0.0.1:8090:80"
</code></pre>
<p>A few key points:</p>
<ul>
<li>Port <code>127.0.0.1:8090:80</code>: Only listens on localhost. Do not expose directly to the public internet.</li>
<li><code>NTFY_AUTH_DEFAULT_ACCESS: "deny-all"</code>: Denies all unauthenticated requests by default. This means only you (with a token or username/password) can send and receive.</li>
<li><code>NTFY_BASE_URL</code>: Fill in the domain you'll eventually use, for example, I use <code>ntfy.sayori.org</code>.</li>
</ul>
<h2>Start</h2>
<pre><code>docker compose up -d
docker compose logs -f
</code></pre>
<p>Local check:</p>
<pre><code>curl http://127.0.0.1:8090/
</code></pre>
<p>You should see ntfy's Web interface responding.</p>
<h2>Create User</h2>
<p>Since we set <code>deny-all</code>, we need to create a user for ourselves:</p>
<pre><code>docker compose exec ntfy ntfy user add --role=admin your_username
</code></pre>
<p>It will ask you to enter a password. Remember this username and password; you'll need it later for sending notifications and the mobile app.</p>
<p>You can also generate a token:</p>
<pre><code>docker compose exec ntfy ntfy token add your_username
</code></pre>
<p>Tokens are more convenient than passwords; you can just include them in the header in scripts.</p>
<h2>Connect Domain</h2>
<p>Similar to Vaultwarden, use Cloudflare Tunnel or Caddy/Nginx reverse proxy.</p>
<p>Cloudflare Tunnel route:</p>
<pre><code>ntfy.example.com
  -&gt; Cloudflare Tunnel
  -&gt; 127.0.0.1:8090
  -&gt; ntfy
</code></pre>
<p>After confirming HTTPS access is working, open <code>https://ntfy.example.com</code> and log in to the Web interface with the account you just created.</p>
<h2>Send Your First Notification</h2>
<p>The simplest way:</p>
<pre><code>curl -H "Authorization: Bearer your_token" \
     -d "Server is still alive" \
     https://ntfy.example.com/test
</code></pre>
<p>Here, <code>/test</code> is the topic name. You can name it anything you like, such as <code>/backup</code>, <code>/alert</code>, <code>/server</code>.</p>
<p>You can also include a title and priority:</p>
<pre><code>curl -H "Authorization: Bearer your_token" \
     -H "Title: Backup Complete" \
     -H "Priority: default" \
     -d "Vaultwarden backup successful, size 2.3MB" \
     https://ntfy.example.com/backup
</code></pre>
<h2>Mobile App</h2>
<p>Android:</p>
<ul>
<li>ntfy client is available on F-Droid.</li>
<li>Also on Google Play.</li>
</ul>
<p>iOS:</p>
<ul>
<li>Search for ntfy in the App Store.</li>
</ul>
<p>After opening the App:</p>
<ol>
<li>In settings, add your self-hosted server address.</li>
<li>Enter your username and password or token.</li>
<li>Subscribe to your topics (e.g., <code>backup</code>, <code>alert</code>).</li>
</ol>
<p>From now on, notifications sent from your server will be pushed to your phone.</p>
<h2>Use in Scripts</h2>
<p>Add a line at the end of your backup script:</p>
<pre><code>NTFY_URL="https://ntfy.example.com/backup"
NTFY_TOKEN="your_token"

# On successful backup
curl -s -H "Authorization: Bearer $NTFY_TOKEN" \
     -H "Title: ✅ Backup Successful" \
     -d "Vaultwarden backup completed $(date +%F)" \
     "$NTFY_URL"

# On failed backup
curl -s -H "Authorization: Bearer $NTFY_TOKEN" \
     -H "Title: ❌ Backup Failed" \
     -H "Priority: high" \
     -d "Vaultwarden backup error, please check logs" \
     "$NTFY_URL"
</code></pre>
<p>Scheduled task failure notification:</p>
<pre><code>some_command || curl -s -H "Authorization: Bearer $NTFY_TOKEN" \
     -H "Title: Scheduled Task Failed" \
     -H "Priority: high" \
     -d "$(hostname): some_command failed to execute" \
     "$NTFY_URL"
</code></pre>
<h2>Integrating with Gatus</h2>
<p>If you're running Gatus for health checks, you can add ntfy as an alert channel in your Gatus configuration.</p>
<p>Gatus supports native ntfy alerts; just configure the server address, topic, and token.</p>
<p>This way, if a service goes down, Gatus will automatically send a notification to ntfy, and your phone will ring.</p>
<h2>Resource Usage</h2>
<p>ntfy is very lightweight.</p>
<p>It's running on my server, usually consuming about 20-30MB of RAM. CPU usage is practically zero. For a 2C2G server, it's no burden at all.</p>
<p>It doesn't require a database. Messages are cached in local files and automatically expire after a certain period.</p>
<h2>Important Notes</h2>
<ul>
<li>Do not write your ntfy token into public repositories.</li>
<li>If you set <code>deny-all</code> but some external services (e.g., Gatus sending from the same machine) need to send notifications without authentication, you can open permissions for specific topics.</li>
<li>Messages are not permanently retained. If you need historical records, the sender should log them itself.</li>
<li>ntfy's Web interface does not need to be exposed to the public internet. The mobile app subscribes using the API.</li>
</ul>
<h2>Is it suitable for a 2C2G server?</h2>
<p>Absolutely. It might be one of the most cost-effective services for a 2C2G server.</p>
<p>Once installed, you'll find that almost every script's final step becomes "send me a notification with the result." This is much more comfortable than SSHing in to check logs every day.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Server Exploration"></category>
  </entry>
  <entry>
    <title>Internet Community Log 1: Linux.do NodeLoc and NodeSeek, mjj and AI related</title>
    <link href="https://blog.sayori.org/en/posts/internet-community-1/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/internet-community-1/</id>
    <published>2026-06-21T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>The first log of Chinese internet communities, focusing only on Linux.do and NodeLoc: what they're good for, and what newcomers should know before joining.</summary>
    <content type="html"><![CDATA[<h1>Internet Community Log 1: Linux.do NodeLoc and NodeSeek</h1>
<p>I first got into communities back in April because of this event <a href="/posts/diary/2026-04-06/2026-04-06-en/">2026-04-06</a>, and then I came across <a href="https://forum.monika.love/">Doki Chinese Club</a>. But for this post, I'm not going to talk about that for now. Instead, I'll discuss two communities where I currently have accounts and get a lot of resources: Linux.do and NodeLoc.</p>
<h2>Linux.do</h2>
<p>Entry: <a href="https://linux.do/">https://linux.do/</a> (Requires a VPN, but you can connect directly by changing DNS)</p>
<p>As the experts say, "Learn AI, go to L-site." The Linux.do forum is a topic of much discussion and mystery outside. After personally investigating for over a month, I'm ready to present my report here.</p>
<p>L-site has relatively strict internal rules, which you can refer to here: <a href="https://linux.do/guidelines">https://linux.do/guidelines</a>. If you're a newcomer, remember to complete the bot's beginner tasks and make sure you've leveled up to level 1 before posting. Also, thoroughly read the rules, especially <code>no giveaways unless necessary</code>. After that, you can basically start your happy journey of browsing, posting, and leveling up.</p>
<p>One major feature of Linux.do is that many big shots run free AI service sites, and some of these sites integrate with Linux.do login. For example, you can register a new account on 'any' using your L-account. If you also have an educational email, you can basically dual-wield. There are also many other free service sites run by experts within the site. If you have an account, you can find these in the <a href="https://linux.do/t/topic/2140307">list of free service sites</a>.</p>
<p>And in the 'Deals &amp; Freebies' section, there are tons of benefits. Although most are temporary, some of the latest deal information also appears here, which is quite rewarding.</p>
<p>Development &amp; Optimization is more technical. It usually contains many AI and programming-related question and technical posts, and they're generally quite new.
<a href="%5Bhttps://linux.do/t/topic/2140889%5D(https://linux.do/t/topic/2140889?u=amiya_desi)">Step-by-step guide to building a relay station VPS+CLI Proxy API (CPA)+NEW API+Docker+Nginx+Cloudflare+SSL+Domain Configuration - A Nanny-level Tutorial</a>, this is a pretty good technical post.</p>
<p>The 'Collaborative Documentation' section has many interesting long-form tutorials, like this <a href="https://linux.do/t/topic/2434230?u=amiya_desi">Newbie Tutorial Collection</a>, which is much more comprehensive than what I'm explaining (haha). The part about changing DNS for direct connection is also there. And then there's this <a href="https://linux.do/t/topic/188813?u=Amiya_desi">[Super Detailed Tutorial] Teach You From Scratch to Get Started with Domains, Cloud Servers, and Deploy New API + Open WebUI!</a>, which is also a pretty comprehensive piece of knowledge. I'm planning to make something similar (haha).</p>
<p>The 'Chit-chat' section has a lot of daily life posts and various fun threads. It feels a bit like the early internet (though I've never experienced it, that's what everyone says)!</p>
<p>After registering, it's recommended to log in to <a href="https://credit.linux.do/">https://credit.linux.do/</a>. This LDC is a type of community points that can be used to exchange for various in-community services and such.</p>
<p>If you don't want to see ads, you can choose to join <a href="https://linux.do/g/g-adsfree">https://linux.do/g/g-adsfree</a>. Also, if you need to post anything related to money, you'll need to join here: <a href="https://linux.do/g/g-trade">https://linux.do/g/g-trade</a>.</p>
<p>In summary, L-site, with its relatively strict rules, has improved the quality of replies and posts, though it can sometimes be a bit frustrating. If you can diligently follow <a href="https://linux.do/guidelines">https://linux.do/guidelines</a> and reach level 2 (level 1 accounts get deleted if inactive for too long, level 2 won't), then you can generally do quite well on L-site. You'll periodically gain various information, knowledge, and free services, and also have a new place to post, share, and promote yourself – a high-quality human information channel in the AI era.</p>
<h3>Registration Method</h3>
<p><a href="https://invite.linuxdo.org/">https://invite.linuxdo.org/</a>. GitHub accounts 5 years or older can use this to register. Note that this requires a direct connection from China, but logging into GitHub requires a VPN, so you'll have to manually switch back and forth.</p>
<p><a href="https://linux.do/t/topic/2317378">https://linux.do/t/topic/2317378</a>. Because of this, there are basically no other channels available now (.</p>
<h2>NodeLoc</h2>
<p>Entry: <a href="https://www.nodeloc.com/">https://www.nodeloc.com/</a></p>
<p>NodeLoc is relatively less strict with rules. (I heard it's a bit like early L-site.) There are also many benefits and other things inside. You can check out this <a href="https://www.nodeloc.com/t/topic/94649">Compilation of all NodeLoc related sites</a>.</p>
<p>NodeLoc's rules are here: <a href="https://www.nodeloc.com/about">https://www.nodeloc.com/about</a>. You can actually see that besides a few absolutely prohibited points, there are basically no other rules.</p>
<p>NodeLoc has no minimum character limit for replies, making it quite free. At the same time, everyone can create and join various sub-forums, covering topics like daily domains, sports, hosts, SIM cards, AI, etc. It also doesn't prohibit public AFF links, which is different from Linux.do.</p>
<p>And the site admin here is quite active in the comment section, feeling pretty friendly.</p>
<p>NodeLoc also has something similar to community points, called 'batteries.' You can get them by signing in daily in the top right corner, or by posting casually, etc. They can also be used to buy things within the community.</p>
<p>In summary, NodeLoc, as a relatively new and small site, is also more free. Of course, this also means the quality of replies is generally quite ordinary, but the management is making adjustments. It's a developing community, and it also offers a lot of knowledge and benefits, making it a high-quality information channel.</p>
<h3>Registration Method</h3>
<p>Currently requires an invitation code to register. The admin happens to have some, (will update them here periodically.)
The event is temporarily over. If you want to join, you can try contacting the admin and stating your needs to request one.</p>
<h2>NodeSeek</h2>
<p>Entry: <a href="https://www.nodeseek.com/">https://www.nodeseek.com/</a></p>
<p><a href="https://www.nodeseek.com/post-822458-1">What must-see benefits and services does our forum have?</a>. The admin posted a thread asking this right after joining. This place is basically a pure mjj gathering spot, where everyone discusses various server-related knowledge and other topics. Members generally have Telegram accounts, and some experts in the threads even said it could be used as a dark version of Baidu for searching, haha.</p>
<p>If you want to discuss server-related topics or get some intelligence, you can try registering.</p>
<h3>Registration Method</h3>
<p><a href="https://www.nodeseek.com/post-16700-1">How to get a NodeSeek forum invitation code</a>. The thread is here. Follow the instructions in the post to try and get an invitation code, or you can wait for the admin to accumulate 1K 'chicken legs' to generate one, but let's not count on it, that's probably a long road ahead (kidding).</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Internet & Community"></category>
  </entry>
  <entry>
    <title>How College Students Use AnyRouter, SharedChat, and cc-switch to Manage AI Quotas</title>
    <link href="https://blog.sayori.org/en/posts/anyrouter-sharedchat-cc-switch-student-guide/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/anyrouter-sharedchat-cc-switch-student-guide/</id>
    <published>2026-06-18T00:00:00.000Z</published>
    <updated>2026-08-02T00:00:00.000Z</updated>
    <summary>A guide for college students on AnyRouter registration, SharedChat GPT quota claiming, and cc-switch configuration, to be watched with my Bilibili video.</summary>
    <content type="html"><![CDATA[<p>This post is a text companion to the video.</p>
<p>The video is here: <a href="https://www.bilibili.com/video/BV12JLX6PE53/">BV12JLX6PE53</a></p>
<h2>What Are These Things, Anyway?</h2>
<p>AnyRouter is a routing service for AI API / Claude Code. Simply put, it gives you a usable API endpoint and Key, which you then plug into tools that support Claude Code / Anthropic interfaces.</p>
<p>SharedChat is another entry point, leaning towards GPT / Codex public welfare quotas. You can think of it as an additional source of Codex quotas.</p>
<p>cc-switch is a desktop configuration management tool, with its GitHub repo at <a href="https://github.com/farion1231/cc-switch">farion1231/cc-switch</a>. Its purpose is to help you switch provider configurations for tools like Claude Code, Codex, and Gemini CLI.</p>
<h2>Registering for AnyRouter</h2>
<p>Official website: <a href="https://anyrouter.top/">https://anyrouter.top/</a></p>
<p>The admin's affiliate link; using this will get both of us $50: <a href="https://anyrouter.top/register?aff=NvOL">https://anyrouter.top/register?aff=NvOL</a></p>
<p>Follow the on-screen instructions during registration. The email verification code might not arrive instantly; wait a few minutes before clicking resend, or you'll just annoy yourself.</p>
<blockquote>
<p>[!TIP]
If you encounter issues registering with an EDU email, you can directly refer to:
<a href="#answer1">👉 What to do if your EDU email can't register</a></p>
</blockquote>
<h2>AgentRouter is also worth a look</h2>
<p>Another entry point you can check out is AgentRouter: <a href="https://agentrouter.org/register?aff=a572">https://agentrouter.org/register?aff=a572</a></p>
<p>You can register/log in with GitHub and Linux Do accounts, and the model list includes <code>gpt-5.5</code> and the Claude series. If you can register, you can use it as a backup option.</p>
<p>Registration requirements are here</p>
<p><img src="https://img.sayori.org/blog/v1/5453f779c641d57284861c64f5afd20253447046eae5c3a9282951bcd434a48d/558.webp" alt="Pasted image 20260717102951.png" /></p>
<p><img src="https://img.sayori.org/blog/v1/af025fd642fc1ad0b49dddd848509b212d5ea81d7c4257f3819af2a1f28f7b1f/1059.webp" alt="agentrouter-model-list.png" /></p>
<h2>Generating an AnyRouter API Key</h2>
<p>Go to the API Tokens page in the backend and create a new token.</p>
<p>Name it whatever you want, but I suggest something clear, like:</p>
<pre><code>cc-switch-anyrouter
</code></pre>
<p>The common information you'll need to fill in is usually:</p>
<pre><code>API Key: Your generated Key
Base URL: The API address provided on the AnyRouter homepage
</code></pre>
<h2>Claiming SharedChat GPT Quotas</h2>
<p>For <a href="https://sharedchat.cc/#/">SharedChat</a>, follow the activity entry points on its page.</p>
<p>This is itself a public welfare project that allows free GPT web-based conversations without registration. The admin recently launched another public welfare Codex project, which you can claim daily.</p>
<p>The process is roughly:</p>
<ol>
<li>Register/log in to the <a href="https://new.sharedchat.cc/list/#/register?i=E8v44">Codex Public Welfare Site</a> using a QQ email, <strong>not the paid site</strong>. Of course, if you want to pay, that's fine too.</li>
<li><img src="https://img.sayori.org/blog/v1/71318c4f60a774125b07bcf03183c52201d19971b2e24c12ec8ff9d500425e68/1280.webp" alt="Pasted image 20260620234009.png" /></li>
<li>Click 'Apply' in the bottom right, write a small reason, and you're good. If your browser gives an error, try another browser or incognito mode.</li>
</ol>
<h2>Installing cc-switch</h2>
<p>cc-switch official repository: <a href="https://github.com/farion1231/cc-switch">https://github.com/farion1231/cc-switch</a></p>
<p>For Windows, usually download the <code>.msi</code> or portable zip. For macOS, check the installation methods in the README. For Linux, typically choose deb, rpm, or AppImage according to your distribution.</p>
<p>After installation, open it. It will detect existing AI CLI tools on your machine, read skills and history. You can use it to manage your current configurations, or to update and install related tools.
<img src="https://img.sayori.org/blog/v1/e9e613b077816c4a4e1f11e9642298f3edc5f2ebdb4901ea5f5e47367d634275/1280.webp" alt="Pasted image 20260620233340.png" /></p>
<h2>Adding Providers in cc-switch</h2>
<p>Taking AnyRouter as an example:</p>
<ol>
<li>Open cc-switch</li>
<li>Go to the provider settings for Claude Code or the corresponding tool.</li>
<li>Create a custom provider.</li>
<li>Enter the provider name, e.g., <code>AnyRouter</code>.</li>
<li>Enter the API Key.</li>
<li>Enter the Request Address / Base URL.</li>
<li>Select the interface format, as prompted on the AnyRouter page.</li>
<li>Save.</li>
<li>Click Use / Switch.</li>
</ol>
<p>If you want to add SharedChat, create another provider and name it clearly:</p>
<pre><code>AnyRouter edu
SharedChat
</code></pre>
<p>Next time you switch, you'll know which quota you're using just by the name.</p>
<h2>Enabling Automatic Routing in cc-switch</h2>
<p>The simplest automatic routing configuration is to enable routing first, then arrange the failover order.</p>
<p>Enable routing in settings.
<img src="https://img.sayori.org/blog/v1/fe6eb6ac016198968b46f8754ab2fd9368a4bbbe9b226718d996d151aed5119a/1280.webp" alt="Pasted image 20260620234413.png" /></p>
<p>Arrange multiple providers in automatic failover.
<img src="https://img.sayori.org/blog/v1/b13d09829bee9cdf265b30d71e9b9835593ec5c3f7c4165f4d4a729ebf5c5d3f/1280.webp" alt="Pasted image 20260620234401.png" /></p>
<h2>Verifying It Works</h2>
<p>After switching, restart your terminal, or just open a new one.</p>
<p>First, ask a question:</p>
<pre><code>/init
</code></pre>
<p>If it returns normally, then try a code task.</p>
<p>If there's an error, check these:</p>
<ol>
<li>Is the Key copied completely?</li>
<li>Does the Base URL have an extra space or a missing path segment?</li>
<li>Did you actually click Use / Switch in cc-switch?</li>
<li>Was the terminal restarted?</li>
<li>Has the quota for the corresponding site been used up?</li>
<li>Is the model name one that the backend currently supports?</li>
</ol>
<h2>Common Issues</h2>
<h3>What to do if your EDU email can't register</h3>
<p>Most likely, your email is on AnyRouter's blacklist.</p>
<p>However, you can also try capitalizing a segment of your school email domain to see if you can receive it. For example, if your email is <code>stu.xxxx.edu.cn</code>, you can try changing it to <code>stu.Xxxx.edu.cn</code>. Sometimes it might send, but whether you'll reliably receive it is another story.</p>
<p>&lt;a id="answer1"&gt;&lt;/a&gt;</p>
<h3>Can't use after connecting to CPA, Sub2</h3>
<p>Because AnyRouter primarily targets tool-side applications like Codex and Claude Code. If you want to connect it to places like CPA or Sub2, you might need to handle request headers. Below are just examples I noted during my troubleshooting.</p>
<table>
<thead>
<tr>
<th>Header</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Authorization</td>
<td>Bearer sk-your_api</td>
</tr>
<tr>
<td>User-Agent</td>
<td>codex_cli_rs/0.114.0 (or other existing version) (Windows 10.0.26100; x86_64)</td>
</tr>
</tbody>
</table>
<h3>AnyRouter is unusable, very laggy</h3>
<p>There's not much to do about this. After all, many people use it simultaneously, so stability depends on the current load. My experience is below.</p>
<blockquote>
<p>[!NOTE]
You just have to try your luck. Generally, gpt5.5 is quite easy to get started with, and once it's working, it's usually stable. Also, it's often easier to get on board in the early morning hours.
When it's crowded, you'll have to queue. You can try opening a new session, sending a 'hi', enabling target mode, and if it disconnects, just resume. It usually connects within ten minutes; if not, it's likely a configuration issue.</p>
</blockquote>
<p>For more issues, you can check this out:
<a href="https://linux.do/t/topic/1779614?U=AMIYA_DESI">Clearing Obstacles for AnyRouter Usage!</a></p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="AI & Workflow"></category>
  </entry>
  <entry>
    <title>(Repost) Why do other apps immediately know what you just searched for? (Including iOS)</title>
    <link href="https://blog.sayori.org/en/posts/cross-app-tracking-device-fingerprinting/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/cross-app-tracking-device-fingerprinting/</id>
    <published>2026-07-23T00:00:00.000Z</published>
    <updated>2026-07-23T00:00:00.000Z</updated>
    <summary>Reposted with original author's permission. Using Loupe to demonstrate what mobile apps can read from your device, photo album, and local network, and how ad SDKs piece together device fingerprints.</summary>
    <content type="html"><![CDATA[<p>&lt;details class="repost-source"&gt;
&lt;summary&gt;Original Article &amp; Authorization&lt;/summary&gt;
&lt;p&gt;Original article: &lt;a href="https://linux.do/t/topic/2598156"&gt;https://linux.do/t/topic/2598156&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Permission granted by the original author.&lt;/p&gt;
&lt;/details&gt;</p>
<p>Why do other apps immediately know what you just searched for?
<img src="https://img.sayori.org/blog/v1/9194bb4cb30a94260cb1e681ffe5f387ef24948b77075c59776976081a386faa/844.webp" alt="原文配图 1" /></p>
<p><strong>Have you ever experienced this:</strong>
One day you search for a pair of Crocs on a social media app, and the very next day, you're scrolling through a completely unrelated shopping app and see recommendations for those exact Crocs...
<strong>You start to panic, trying to remember if you ever mentioned those Crocs in the second app.</strong>
After confirming you hadn't, you start to guess: either "these two companies are definitely secretly swapping my data," or "oh no, my phone's microphone is eavesdropping on me."
While both of those scenarios are pretty wild, especially microphone eavesdropping (which is easy to expose with a packet capture), considering the low bar for internet companies these days, I wouldn't dare vouch for them.</p>
<p><img src="https://img.sayori.org/blog/v1/69b17f55c0b8d7e7cd7d722c7dce95e0293867149dc25a8b8a8f166785ff46e4/542.webp" alt="原文配图 2" /></p>
<p>However, advertisers actually have a more covert and secure way to push a pair of Crocs across apps right in front of you:</p>
<p>For example, if a phone searches for Crocs in app A, that preference is recorded under the device's name.
Switch to app B, and if it recognizes the same device, it can continue pushing that preference. It recognizes the machine; it doesn't necessarily need to know your name or who you are.
So the question is, how do advertisers record this information, and how does it leak out?
Recently, I discovered an app made by a security team: Loupe.
It has only one function: to tell users how much data a mobile app can actually get from you? And what exactly gets exposed every time you "allow" an additional permission?</p>
<p><img src="https://img.sayori.org/blog/v1/57f62070158f9b3b285294140c8f0878640f2042d7df72c3e6639358be3a1720/747.webp" alt="原文配图 3" /></p>
<h3>For example, the moment I opened Loupe, without granting any permissions, it immediately gave me a rude awakening.</h3>
<p><img src="https://img.sayori.org/blog/v1/7898d775788f83b79ccdc26953772c96d2ae0eab51c9ca805855c89006732deb/718.webp" alt="原文配图 4" /></p>
<p>It knew I set my phone's region to Singapore, use a mixed Chinese-English keyboard, activated the device in September 2023, have copied 29,034 times since then, and last booted 8 days, 3 hours, and 44 minutes ago.
It even went ahead and drew a profile of me. Knowing I have Steam and Discord installed, it deduced I'm likely a gamer. Then, seeing GitHub and Slack, it inferred I work in the tech industry.</p>
<p><img src="https://img.sayori.org/blog/v1/2ca36a53e3b879eb45873c9d200eff29fca89280fb387f6eada90edcb53c0e36/694.webp" alt="原文配图 5" /></p>
<p>The above is just what's displayed in the app. If you check the more detailed report, you'll find it knows even more.</p>
<p><img src="https://img.sayori.org/blog/v1/eb4c167fcdf08ee034bc37d344c49b385f0ef20830af2d00fa0271a73bbc5f86/736.webp" alt="原文配图 6" /></p>
<blockquote>
<p><strong>For example, it knows my iPhone 15 Pro currently has 105GB of storage left, is in dark mode, screen brightness is over half, battery is at 60%, not plugged in; it's dual SIM, both cards are on 5G, and it even knows how the phone is tilted and in which direction at this very moment.</strong></p>
</blockquote>
<p>You might still think, "So what if it knows these bits and pieces? Can it really pinpoint us?"
Indeed, it can't.</p>
<p>Besides, this is still just information Loupe sees based on public APIs:
<strong>What if, like with other apps, I grant Loupe access to my photo album, location, and other permissions? What information would it then know?</strong></p>
<p><img src="https://img.sayori.org/blog/v1/829c5a90eba9621b7769744cb31910dafddc34b843720b918658445b01bec084/425.webp" alt="原文配图 7" /></p>
<p><strong>I tried granting photo album permission. Loupe quickly told me I have 1,119 videos and 9,371 photos in my gallery, with 3,033 of them containing geolocation data, and it listed the places I've visited most frequently.</strong></p>
<p><img src="https://img.sayori.org/blog/v1/17df4b2a057771f633636bfa18b0729bd42169280500a1cbeb37df2c766393f5/654.webp" alt="原文配图 8" /></p>
<p>Don't be fooled by the app only pinpointing "Yuhang District"; this is just for Loupe's display convenience.
You should know that EXIF data in photos contains latitude and longitude accurate to about ten meters. An app just needs to analyze the frequency and timestamps of each location to roughly guess where I live, where I work, and that some obscure small town I occasionally pop up in during holidays is likely my hometown.</p>
<p>I recommend setting all apps to use the system's photo picker, which pops up and lets you select a few photos to authorize. In this case, iOS defaults to not sending photo location data to the app.</p>
<p><img src="https://img.sayori.org/blog/v1/0f3bc6fe8bb07b96168fc1d0a2f3f19551403e7762e850e466770e58fc5439c3/610.webp" alt="原文配图 9" /></p>
<p><strong>Oh, and when you encounter those pop-ups asking if you want to enable all permissions for "convenience," remember to select 'Keep Current Settings'.</strong></p>
<p><img src="https://img.sayori.org/blog/v1/7b7f5633ff1ca907616acc0326026b96e0cb03a246c87342a1c2f3390595cfbe/594.webp" alt="原文配图 10" /></p>
<h4>Next, let's grant Loupe local network permission and see what it can get.</h4>
<p>Honestly, who would think much about this permission normally? It's just for connecting to a printer or casting a screen, right?
But after I tapped 'Allow,' all my colleagues' computers on the local network, an HP laser printer, and two Ugreen NAS devices all showed up.</p>
<p><img src="https://img.sayori.org/blog/v1/b354a98e6838be31ac3eac62efd0b9d33cbde9235e6c6df60af5fa49504df02d/659.webp" alt="原文配图 11" /></p>
<p>Of course, it's reasonable for this permission to see all nearby devices; otherwise, it wouldn't be able to find them.
I just don't understand, shouldn't this permission only pop up when I actually need to cast my screen?</p>
<p><strong>Why do many apps, simply by being opened, reach out and ask for it?</strong></p>
<p><img src="https://img.sayori.org/blog/v1/018c6bcd7d96b95e124a79dc3a89d822757990c299c720feb99c018787c2c62a/484.webp" alt="原文配图 12" /></p>
<p>I won't go into detail about location, Bluetooth, and calendar permissions; you can see the information in the screenshots.
In short, every time you tap 'Allow,' the app understands you more deeply, and your device fingerprint becomes clearer and more diverse.</p>
<p><img src="https://img.sayori.org/blog/v1/a888e60b7ff10c17c0e94847e1e711e0a5b755343788b9bf3f097fc490b9e80a/1080.webp" alt="原文配图 13" /></p>
<h3>So how does App B know the fingerprint and preferences calculated for me in App A?</h3>
<p>The answer is advertisers.
Many apps don't build their own ad systems; instead, they integrate an existing ad SDK. The splash screen ads and in-feed ads you see in an app are all fetched by this code from an ad platform and then displayed to you.
At the same time, the SDK sends your phone's characteristics back to the ad platform.</p>
<h3>Logically, an SDK shouldn't need to go through all this trouble to identify your phone.</h3>
<p>Apple originally issued a legitimate identifier called IDFV, which means "several apps from the same company share one ID." So, if you have several apps from the same developer installed, it's effortless for them to recognize you as the same person.</p>
<p>But once you cross company boundaries, IDFV isn't universal. That's where IDFA comes in. IDFA is one ID per phone, universal across all apps, specifically designed to help the advertising industry identify people across apps.
But then another problem arose.
In 2021, Apple launched App Tracking Transparency (ATT), putting the IDFA switch back in the user's hands. For an app to use it, it first has to pop up and ask you. If you tap 'Ask App Not to Track,' that ID is immediately zeroed out.</p>
<p><img src="https://img.sayori.org/blog/v1/82e1cd09885b99fd25755c3859e142953a7c72d5c6b182b0b7f9a18f29a94b35/663.webp" alt="原文配图 14" /></p>
<h3>So in the end, advertisers had to take matters into their own hands, using this device fingerprinting tactic.</h3>
<p>So, are apps really secretly using this tactic?</p>
<p>Loupe's development team is called Mysk. They previously packet-captured Facebook, Instagram, Threads, Chrome, and Spotify, and found that even though these apps promised in Apple's privacy manifest, "I read this information, but I will never transmit it," they still secretly sent out the user's phone uptime.
Seriously, guys, what do you need uptime for? Is your taste more unique than Walmart plastic bags or attack helicopters...?</p>
<blockquote>
<p>The truth is, there's only one reason: piecing together device fingerprints.</p>
</blockquote>
<p><img src="https://img.sayori.org/blog/v1/92ba7574a509003ab1400fbecd7c47a4a5b3de9d8a18c8a38f6e0eda321c6b93/1080.webp" alt="原文配图 15" /></p>
<p>Similar things have happened in the Android camp.
In 2025, a Google research team published a paper where they analyzed 180,000 Android apps and 220,000 SDKs. They found that among popular apps in app stores, 39.4% contained SDKs that collect device fingerprints. If categorized into dating and comic apps, this number soared to 82% and 88% respectively.</p>
<p>Currently, Loupe is completely free and open-source. I think all iPhone users should give it a try (Android users might have to wait a bit longer).
Of course, after trying it, there's no need to be overly paranoid.
After all, advertisers have many ways to guess what you like to watch or buy, besides device fingerprinting, such as similar audiences, account linking, and collaborative filtering.
I believe Loupe's biggest value is that it lets you know what data of yours is exposed, and under what circumstances, thereby raising your security awareness. Just be more careful in your daily life.</p>
<p><strong>Currently, Loupe is completely free and open-source. I think all iPhone users should give it a try (Android users might have to wait a bit longer).</strong>
<img src="https://img.sayori.org/blog/v1/31b211310f3ce3627b073d31f2a14814dcde44b8d84c36055d775b3370a2df34/1280.webp" alt="原文配图 16" /></p>
<blockquote>
<p><strong>If you're interested in this topic, you can check out my previous articles:</strong></p>
<p><a href="/posts/rogue-app-advertising-user-traps/">(Repost) An insider reveals how rogue apps trap and hunt users</a></p>
</blockquote>
<blockquote>
<p><a href="/posts/mobile-app-ad-targeting-device-profiling/">(Repost) How your phone is treated differently by them</a></p>
</blockquote>
<p><strong>Related articles, images, data, and code sources:</strong></p>
<ol>
<li>https://mysk.blog/2024/05/03/apple-required-reason-api/</li>
<li>https://mp.weixin.qq.com/s/fR_GTcbEg84GOcQ5XXcyCw</li>
<li>https://apps.apple.com/cn/app/loupe-app能看到什么/id6766152470</li>
<li>https://github.com/mysk-research/loupe</li>
<li>https://nopj.cn/d/7382-loupekai-yuan-xiang-mu-shi-shi-jian-kong-iosyuan-sheng-appshu-ju-quan-xian</li>
</ol>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Internet & Community"></category>
  </entry>
  <entry>
    <title>(Repost) Following up on the last post: How is your phone treated differently by them?</title>
    <link href="https://blog.sayori.org/en/posts/mobile-app-ad-targeting-device-profiling/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/mobile-app-ad-targeting-device-profiling/</id>
    <published>2026-07-23T00:00:00.000Z</published>
    <updated>2026-07-23T00:00:00.000Z</updated>
    <summary>Reposted with permission from the original author. Discusses how mobile users are targeted differently, from the perspectives of quick apps, ad SDKs, and device/installed app profiling, and compiles common ad handling methods.</summary>
    <content type="html"><![CDATA[<p>&lt;details class="repost-source"&gt;
&lt;summary&gt;Original Text and Authorization&lt;/summary&gt;
&lt;p&gt;Original text: &lt;a href="https://linux.do/t/topic/2502409"&gt;https://linux.do/t/topic/2502409&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Authorized by the original author&lt;/p&gt;
&lt;/details&gt;</p>
<p><img src="https://img.sayori.org/blog/v1/6c462843c7d2dea9a89498d322e0e1b39a8992665c6f6383bb5cc6340db43f24/1162.webp" alt="Original image 1" /></p>
<blockquote>
<p>Previous post: <a href="/posts/rogue-app-advertising-user-traps/">(Repost) An insider reveals how rogue apps besiege and hunt down users to fellow netizens</a></p>
</blockquote>
<p>———————————————————————————————————————————————————————————</p>
<h1>Main Text:</h1>
<p><strong>Let's talk about where the ads on your phone come from, and how you're treated differently by them.</strong></p>
<blockquote>
<p><strong>First, let's take Quick Apps as an example:</strong></p>
</blockquote>
<p>I'm sure you've encountered this situation: when opening an app, many Quick Apps are launched.</p>
<p><img src="https://img.sayori.org/blog/v1/aca09676e3e3f1c724de4c3c122c851a3976351f1a84388c08f2b3dd72e78194/323.webp" alt="Original image 2" /></p>
<p>Online discussions and speculations about the above "viral jumps" include:</p>
<ol>
<li>
<p>Compliant jumps triggered by a slight "shake"</p>
</li>
<li>
<p>The app secretly clicking on ads itself</p>
</li>
</ol>
<p>But these were all just speculations, always lacking concrete evidence. So, after analyzing packet capture data and reading developer documentation, I found that things aren't as complicated as they seemed.</p>
<hr />
<p><strong>Quick Apps are different from regular ad-jumping apps</strong></p>
<p>Regular ad-jumping apps are intercepted by the system, and a pop-up asks for confirmation.</p>
<p><img src="https://img.sayori.org/blog/v1/697abeb5f926191d7124dd79cbaae33318c3067f67b2c13b165a121c1b0e6c52/672.webp" alt="Original image 3" /></p>
<p>However, Quick App jumps are set independently, meaning they jump by default if you haven't configured them. Wait, how do apps receive these Quick App ads? (Calling out a certain Thunder download app)</p>
<p>Nowadays, apps don't need to pull ads themselves; instead, they integrate ad SDKs, and ads are pushed by the SDKs.</p>
<p><img src="https://img.sayori.org/blog/v1/f99ebd0c03894acbeb93549a140fbed0263f77bf523aa5cffe3eab0e36c5bf23/662.webp" alt="Original image 4" /></p>
<h2><strong>Specific Implementation</strong></h2>
<p>Knowing this, we can achieve the same behavior as shown in the header image.</p>
<p>The launch method is no different from a regular app; both use intents to pass the Quick App protocol and package name, for example, hap://app/com.zywl.tdwallpaper</p>
<p><img src="https://img.sayori.org/blog/v1/4c501013ea4c1f5812b391af27c6e0f6fab03ca7d1c5ff20f1bec39c3b5ef75a/647.webp" alt="Original image 5" /></p>
<h2><strong>PS: Frequently Asked Questions</strong></h2>
<blockquote>
<h3><strong>Why do Quick App settings and features vary across different phone brands?</strong></h3>
<p>The Quick App Alliance only unifies technical specifications; the actual implementation is up to the major system manufacturers. This means manufacturers can choose to follow them, not follow them, disable specific features, or open up special interfaces.</p>
<h3><strong>Why aren't any Quick Apps mentioned in the National Cybersecurity Notification Center's reports?</strong></h3>
<p>Currently, there aren't any particularly rogue Quick Apps (or maybe I just haven't found them). The rogue behavior is actually external (webpages, apps) jumping to Quick Apps.</p>
<h3><strong>Why isn't the frequent launching of Quick Apps by other apps, which severely impacts user experience, curbed by manufacturers?</strong></h3>
<p>The development of Quick Apps is severely lagging. They said they'd fix the jumping issue in 2021, but years have passed with no visible progress.</p>
</blockquote>
<p><img src="https://img.sayori.org/blog/v1/ab7a4ab9b28e1af6238c9946d6f744c34f42b179b384b443dd77233ea34bf9e8/632.webp" alt="Original image 6" /></p>
<blockquote>
<p>**
Secondly, how are we treated differently by them?**</p>
</blockquote>
<h1>1. Upon detecting these package names, apps may proactively reduce ads and privacy overreach</h1>
<blockquote>
<p>Many small and medium-sized utility apps, as well as repackaged domestic apps, have built-in unified risk control rules. Once they detect that a phone has apps for rights protection, official supervision, privacy detection, or reverse engineering installed, they will immediately reduce ad frequency, disable silent permission reading, and stop bundling deceptive downloads. This is to avoid user complaints and regulatory penalties, <strong>because these people are not to be trifled with, and they are not the target audience.</strong></p>
</blockquote>
<h2>1. Rights Protection &amp; Complaint Apps</h2>
<p><strong>Truth Evidence Collection</strong></p>
<p>Package name: <code>com.ip360.truthso</code></p>
<p>Function: Upon detection, significantly reduces splash/pop-up ads, disables silent permission reading, and prohibits deceptive bundled software downloads.</p>
<p><strong>Heimao Complaint</strong></p>
<p>Package name: <code>com.sina.blackcat</code></p>
<p>Function: Reduces high-frequency in-feed ads, restricts privacy data uploads, and avoids non-compliant promotional activities.</p>
<h3>Similar Rights Protection &amp; Evidence Collection Apps (but manufacturers also apply risk control to reduce ads)</h3>
<p><strong>Mobile Notarization (Evidence Manager)</strong></p>
<p>Package name: <code>com.fengyu.notary</code></p>
<p>A notarization app commonly used by lawyers for evidence preservation. Most rogue software will curb their illicit behavior upon detection.</p>
<p><strong>Evidence Collection Pro</strong></p>
<p>Package name: <code>com.zhengqu.app</code></p>
<p>Webpage/screen recording infringement evidence collection tool, a high-frequency package name on risk control whitelists.</p>
<p><strong>Baquanwang</strong></p>
<p>Package name: <code>com.baoquan.org</code></p>
<p>Blockchain electronic evidence preservation, on manufacturers' high-risk control lists.</p>
<h2>2. Official Government/Enterprise Apps</h2>
<p><strong>Public Security One-Stop Service</strong></p>
<p>Package name: <code>com.ga.egov</code></p>
<p>Function: Tags users with stable employment in public service or government/enterprise as high-value. Some small and medium rogue apps will proactively disable silent permission reading and stop bundling third-party software promotions upon detection.</p>
<p><img src="https://img.sayori.org/blog/v1/6c85a1e4c496b6ae0dc217a43a8648e93a476aa427541169b5dfb456f1329a9e/451.webp" alt="Original image 7" /></p>
<p><strong>MIIT App Personal Information Protection Detection (official mini-program has no standalone installation package, accompanies official app)</strong></p>
<p><strong>12321 Reporting Center</strong></p>
<p>Package name: <code>cn.12321.android.jbzs</code></p>
<p>If this package is detected, some ad SDKs will directly restrict pop-ups and skip forced splash screen ads to avoid official complaints and penalties.</p>
<p><strong>National 12315 Platform</strong></p>
<p>Package name: <code>com.samr.cdr（因为国家市场监督管理总局 就是SAMR 缩写</code>)</p>
<p>Official consumer rights protection app from market supervision, highest-level risk control whitelist.</p>
<h2>3. Security/Antivirus, Privacy Behavior Detection Tools</h2>
<p><strong>LibChecker (APP Component / Ad SDK Detection God-tier Tool)</strong></p>
<p>Package name: <code>com.absinthe.libchecker</code></p>
<p>Specifically scans for ad tracking points and tracking SDKs. Almost all Pangle / Tencent Ad / Kuaishou ad SDKs have built-in risk control for this package name; if detected, they directly reduce ad exposure.</p>
<p><strong>Exodus Privacy (Open-source Privacy Tracker Detection)</strong></p>
<p>Package name: <code>org.eu.exodus_privacy.exodusprivacy</code></p>
<p>A well-known foreign tracking SDK scanning tool; many domestic apps implement compatibility risk control for it.</p>
<p><strong>TrackerControl</strong></p>
<p>Package name: <code>org.faircode.trackercontrol</code></p>
<p>Real-time monitoring of app privacy network reporting; after detection, it restricts user profile-based ad pushes.</p>
<p><img src="https://img.sayori.org/blog/v1/15e30ec452c4f10791d72b3520c11e3a241a22bfe485064c246f47651068a0f1/937.webp" alt="原文配图 8" /></p>
<p><strong>HttpCanary (Little Yellow Bird Packet Capture)</strong></p>
<p>Package name: <code>com.guoshi.httpcanary</code></p>
<p>A god-tier tool for packet capture and forensics; once its installation is detected, it will disable sensitive network reporting and reduce ad requests.</p>
<p><strong>360 Mobile Security</strong></p>
<p>Package name: <code>com.qihoo360.mobilesafe</code></p>
<p><strong>Tencent Mobile Manager</strong></p>
<p>Package name: <code>com.tencent.qqpimsecure</code></p>
<p>Package names of two major security vendors; some rogue software will actively curb bundled installations and malicious pop-ups.</p>
<h2>4. Some System Behavior Logs / Permission Monitoring Tools</h2>
<p><strong>Permission Dog (PermissionHub)</strong></p>
<p>Package name: <code>com.gaurav.ansu.permissionhub</code></p>
<p>Monitors apps for unauthorized privacy access; after detection, it reduces background privacy collection and targeted ads.</p>
<p><strong>AppOps Permission Management</strong></p>
<p>Package name: <code>com.suddenapp.ops</code></p>
<p>A fine-grained permission auditing tool, a high-frequency risk control whitelist entry.</p>
<p><img src="https://img.sayori.org/blog/v1/a98d00a730633870cebddf3a578f03a6a67cab6911de065c1198f3b692fb36d6/1280.webp" alt="原文配图 9" /></p>
<h2>5. Reverse Engineering / Debugging Tools</h2>
<p><strong>MT Manager</strong></p>
<p>Package name: <code>shturl.cc/x</code></p>
<p>APK decompilation, package modification tools – most rogue apps that are repackaged detect these and directly block all ad pop-ups.</p>
<p><strong>VMOS, Light Speed Virtual Machine</strong></p>
<p>Package names: <code>com.vmos.pro</code>, <code>com.gx.virtual</code></p>
<p>Virtual machine apps are deemed forensic or reverse engineering environments by manufacturers, directly shutting down all commercial ad logic.</p>
<h1>Two, What are the common risk control rules built into ad SDKs?</h1>
<blockquote>
<h4>(They don't just detect individual apps, but also various system fingerprints)</h4>
</blockquote>
<blockquote>
<h4>As long as the phone has <strong>packet capture tools, virtual machines, permission auditing, or evidence preservation/rights protection apps</strong></h4>
<ol>
<li>Some ad SDKs will automatically:</li>
<li>Force skippable splash ads, cancel shake-to-skip / full-screen pop-up ads</li>
<li>Reduce ad display frequency (from high to low)</li>
<li>Disable silent installation and third-party software bundling</li>
<li>Stop collecting and reporting private information like location and device ID</li>
</ol>
</blockquote>
<h4>But there are also limitations to their effectiveness:</h4>
<ol>
<li>Risk control is most obvious only for <strong>domestic small and medium-sized developers, standalone utility apps, and cracked/repackaged/modified apps</strong>;</li>
<li>Mainstream apps from big companies like WeChat, Douyin, and Taobao <strong>only slightly reduce non-compliant ads</strong>, but won't completely shut down compliant commercial ads.</li>
<li>Pure rogue or virus apps <strong>won't care about you</strong></li>
</ol>
<p><strong>But don't ad SDKs all have to comply with advertising laws?</strong></p>
<p>Take the Ocean Engine ad SDK, for example. Ads are configured by advertisers in the Ocean Engine backend, where they can set up landing pages (i.e., web pages). Ocean Engine's official AI says that "compliant" JS can be embedded. So, in such a long chain, where exactly did things go wrong? I really don't know.</p>
<blockquote>
<p>Don't ask me why I don't actually verify it; testing requires an enterprise user.</p>
</blockquote>
<p>https://jishuzhan.net/article/2056313256901971970</p>
<h4>Screenshot from Ocean Engine documentation:</h4>
<p><img src="https://img.sayori.org/blog/v1/67d152b2e9079486f93206dcef6cce33cbda9be954c1e2b2eec003d304c7aec1/1280.webp" alt="Original image 10" /></p>
<h4><img src="https://img.sayori.org/blog/v1/1cf4882660576131872cacf7d8dcf45d9bb8085a474c02d68055e85ebd9f6cab/1280.webp" alt="Original image 11" /></h4>
<h1>Three, How to distinguish between high-net-worth users and low-spending groups by getting phone models?</h1>
<blockquote>
<p>It's simple: by looking at the phone model and price, you can differentiate between rich/poor/consumerists/low-desire individuals/elderly/children. Combined with app package names, you can also identify approximate regions, work situations, marital status, income levels, making the user profile crystal clear.</p>
</blockquote>
<blockquote>
<p>Ad SDKs grab phone models and use official new phone pricing to categorize basic user tags: foldable phones and high-end flagship users are classified as <strong>high-net-worth individuals</strong>, avoiding small online loans and low-price group-buying ads, instead targeting them with high-end real estate, luxury car maintenance, private wealth management, and light luxury product marketing. Entry-level phones costing a thousand yuan and older models are deemed <strong>price-sensitive low-spending groups</strong>, significantly increasing ad fill rates and frequently pushing content like money-saving deals, flash sales, and cash loans. Old feature phones and devices adapted for large fonts are default-marked as <strong>middle-aged and elderly users</strong>. Devices frequently used for games and online education are identified as <strong>minors and student groups</strong>, with targeted ads for their respective demographics. Beyond phone models, combining IP geolocation and device usage duration can further infer the user's city and occupation type. Then, by integrating installation records of dating and parenting apps, marital status and family structure can be pieced together, <strong>building a complete user profile to achieve differentiated pricing and ad harvesting</strong>.</p>
</blockquote>
<h1>Four, How to distinguish between high-net-worth users and low-spending groups by getting package names?</h1>
<blockquote>
<p>Characteristics of high-net-worth individuals: <strong>Luxury cars, financial investments, high-end business travel</strong></p>
</blockquote>
<h2>1. Luxury Car Brands</h2>
<ol>
<li>
<p><strong>Mercedes me Official Mercedes-Benz APP</strong></p>
<p>Package name: <code>com.daimler.ris.mercedesme.cn</code></p>
<p>Function: Identifies high-income, premium customer base, significantly cuts down on vulgar ads like coin-splitting, price-haggling, and small loans, reduces forced pop-up ads, precisely pushes high-ticket ads for luxury car maintenance, high-end wealth management, luxury goods, and premium real estate</p>
</li>
<li>
<p><strong>BMW Official APP</strong></p>
<p>Package name: <code>com.bmw.connected.cn</code></p>
<p>Function: Identifies upper-middle-class and above consumers, decreases exposure frequency of incentivized video ads, restricts high-frequency collection of background privacy profiles, prioritizes ads for business travel, high-end insurance, and affordable luxury consumption</p>
</li>
<li>
<p><strong>Official Tesla APP</strong></p>
<p>Package name: <code>com.teslamotors.tesla</code></p>
<p>Function: Identifies highly educated new middle-class individuals, blocks low-price lead generation ads from lower-tier markets, curbs malicious lock screen and 'shake-to-open' pop-up ads, pushes ads for smart home, high-end travel, and private wealth management</p>
</li>
<li>
<p><strong>Porsche China</strong></p>
<p>Package name: <code>com.porsche.porschecn</code></p>
<p>Function: Top-tier high-net-worth user tag, almost completely disables all incentivized ads targeting lower-tier markets, only retains brand-related and high-end service commercial ads</p>
</li>
<li>
<p><strong>Land Rover InControl</strong></p>
<p>Package name: <code>com.landrover.incontrol.cn</code></p>
<p>Function: Identifies high-end self-driving and high-spending customer groups, reduces push notifications for low-price group buys and 'wool-gathering' (bargain-hunting) type feed ads</p>
</li>
</ol>
<h2>2. High-End Banking, Brokerage &amp; Finance</h2>
<ol>
<li>
<p><strong>China Merchants Bank Lifestyle App</strong></p>
<p>Package name: <code>com.cmbchina.cmbcredit</code></p>
<p>Function: Marks frequent middle-class and potential private banking users, restricts placement of small online loan ads, curbs forced splash screen ads, pushes ads for large-sum wealth management, premium credit cards, and trusts</p>
</li>
<li>
<p><strong>ICBC Mobile Banking</strong></p>
<p>Package name: <code>com.icbc.mobile.android</code></p>
<p>Function: Identifies stable high-net-worth users, reduces fill rate for low-price lead generation ads, reduces silent collection of user behavior data by the app in the background</p>
</li>
<li>
<p><strong>East Money</strong></p>
<p>Package name: <code>com.eastmoney.android.berton</code></p>
<p>Function: High-value user tag for investment and wealth management, blocks lower-tier market viral new user acquisition ads, moderately reduces frequency of pop-up ads</p>
</li>
</ol>
<h2>3. High-End Membership E-commerce, Boutique Supermarkets</h2>
<ol>
<li>
<p><strong>Sam's Club</strong></p>
<p>Package name: <code>com.walmart.samsclubcn</code></p>
<p>Function: Identifies high-spending paid membership demographic, blocks special offer group buy and price-haggling ads, but may push commercial ads for high-end fresh produce, home goods, and major mother-and-baby brands</p>
</li>
<li>
<p><strong>JD.com (Standard Version, not Lite)</strong></p>
</li>
</ol>
<p>Package name: <code>com.jingdong.app.mall</code></p>
<p>Purpose: Identifies regular online high-spending users. JD.com features: brand premium + after-sales reputation + exclusive choice for those who prefer convenience over saving money + platform for large electronic purchases.</p>
<h2>4. High-end Travel, Airline Business Travel</h2>
<ol>
<li><strong>Air China</strong></li>
</ol>
<p>Package name: <code>com.airchina.iphone.android</code></p>
<p>Purpose: Identifies high-frequency business travelers and high-income individuals. Reduces various deceptive download/bundle ads, pushes high-end hotel and business travel service ads.</p>
<ol>
<li><strong>Shangri-La</strong></li>
</ol>
<p>Package name: <code>com.shangri.la.mobile</code></p>
<p>Purpose: Labels users as frequent high-end hotel guests, high-net-worth vacationers, or business accommodation users. Reduces various malicious pop-up ads.</p>
<ol>
<li><strong>Marriott Bonvoy</strong></li>
</ol>
<p>Package name: <code>com.marriott.mobile</code></p>
<p>Purpose: Identifies global high-end business and leisure accommodation users. Significantly reduces ad exposure frequency, targeted push of high-end vacation and private insurance ads.</p>
<ol>
<li><strong>InterContinental Hotels IHG</strong></li>
</ol>
<p>Package name: <code>com.ihg.mobile</code></p>
<p>Purpose: Identifies high-frequency business accommodation users. Blocks special offer coupons and community group-buying type of in-feed ads.</p>
<h1>Industry-standard "Low-spending" or "Price-sensitive User Identification Package Names"</h1>
<blockquote>
<p>Characteristics of low-spending users: "wool-gathering" (bargain hunting), low prices, group buying.</p>
</blockquote>
<blockquote>
<h4>(Ad SDKs detect these package names, identify "wool-gathering" users in lower-tier markets, significantly increase ad exposure frequency, and frequently push incentive-coin, low-price, and small-loan type ads.)</h4>
</blockquote>
<h2>1. Lite versions and coin-earning task versions of major platforms</h2>
<ol>
<li><strong>Douyin Lite</strong></li>
</ol>
<p>Package name: <code>com.bytedance.douyinlite</code></p>
<p>Purpose: Marks users as "wool-gathering" and price-sensitive. Significantly increases exposure frequency for splash, interstitial, and rewarded video ads; frequently pushes new user acquisition/viral marketing, coin-earning tasks, and low-price product ads.</p>
<ol>
<li><strong>Kuaishou Lite</strong></li>
</ol>
<p>Package name: <code>com.kuaishou.nebula</code></p>
<p>Purpose: Core label for lower-tier markets. Increases lock screen and floating pop-up ads, prioritizes pushing high-conversion ads like small loans and group-buying/bargaining.</p>
<ol>
<li><strong>JD.com Lite</strong></li>
</ol>
<p>Package name: <code>com.jd.jdlite</code></p>
<p>Purpose: Identifies users sensitive to low prices and discounts. Massively pushes in-feed ads for flash sales and community group-buying.</p>
<ol>
<li><strong>Taobao Special Offer (Taote)</strong></li>
</ol>
<p>Package name: <code>com.taobao.lite</code></p>
<p>Purpose: Label for e-commerce users in lower-tier markets. Increases ad fill rate, frequently triggers rewarded video and pop-up coupon ads.</p>
<ol>
<li>
<p><strong>Toutiao Lite</strong></p>
<p>Package name: <code>com.ss.android.article.lite</code></p>
<p>Function: Identifies users who read news for rewards, frequently collects user behavior profiles in the background, continuously pushes various money-making task ads.</p>
</li>
</ol>
<h2>2. Community Group Buying, Low-Price Fresh Produce</h2>
<ol>
<li>
<p><strong>Duoduo Maicai</strong></p>
<p>Package name: <code>com.xunmeng.pinduoduo.maicai</code></p>
<p>Function: Tags offline low-price consumers, pushes neighborhood group buying and daily necessities special offer ads, increases frequency of pop-up coupon ads.</p>
</li>
<li>
<p><strong>Meituan Youxuan</strong></p>
<p>Package name: <code>com.meituan.youxuan</code></p>
<p>Function: Identifies users in lower-tier communities, increases ad spend for low-cost local life traffic acquisition.</p>
</li>
</ol>
<h2>3. Free Online Novels, Money-Saving Tools</h2>
<ol>
<li>
<p><strong>Tomato Free Novels</strong></p>
<p>Package name: <code>com.bytedance.fanqienovel</code></p>
<p>Function: Relies on "free incentive monetization" user tags, frequently embeds incentive ads and pop-up app promotion ads in each chapter.</p>
</li>
<li>
<p><strong>WiFi Master Key</strong></p>
<p>Package name: <code>com.snda.wifilocating</code></p>
<p>Function: Identifies users sensitive to "sinking market" traffic, heavily pushes ads for saving money, small loans, and cheap phone bills.</p>
</li>
</ol>
<h1>III. So, any ultimate tricks I can teach my pals? Yes!</h1>
<blockquote>
<ol>
<li>
<p><strong>Change simplified Chinese to traditional Chinese (Hong Kong/Taiwan) or English</strong>. Ethnic minority compatriots can change it to Tibetan. You can keep the region as mainland China, but if you're worried, change it to Hong Kong, Macau, or Taiwan. This is because fewer non-simplified ad SDKs are deployed, and overseas ad delivery systems are independent of domestic simplified Chinese ad SDKs. This can significantly reduce the push of "sinking market" targeted marketing ads and avoid detailed user profile collection.</p>
</li>
<li>
<p><strong>Search for the overseas version of the software in the Google Play Store</strong> and replace it (foreigners don't deploy simplified Chinese SDK ads). Overseas versions won't have built-in domestic ad SDKs like Pangle or Tencent Ad Alliance, and lack sophisticated user segmentation ad delivery mechanisms. This will significantly reduce the number of splash screen pop-ups and incentive-based ads.</p>
</li>
<li>
<p><strong>Install the official 12315 and 12321 consumer rights protection apps and the LibChecker privacy detection tool as needed</strong>. These can both curb illegal ad behavior from most niche rogue apps and provide evidence of illegal privacy collection. If you encounter apps with malicious over-marketing or unauthorized information theft, report them to regulatory platforms promptly. (Here, apps like "Jump Jump" are recommended, but due to recent crackdowns, many apps' splash screen jump ads have been urgently hot-updated and removed.)</p>
</li>
<li>
<p><strong>The ultimate trick: Unlock the bootloader</strong>, then ROOT and install various frameworks to isolate permissions and create a fake virtual environment to deceive apps, making them "see nothing" (at the very least, they'll revert to default software promotion ads). This means disabling sensitive permissions for apps like contacts, app list, location, and device identifiers. Use virtual machine tools to set up a virtual operating environment, falsely report device parameters, so ad SDKs cannot read the real device model or installed package information, and can only push general, conventional ads, preventing precise segmentation and harvesting. ( <a href="https://slimenull.com/posts/20221022104302/">[Full Guide] Flashing, BL Lock, Bootloader, Recovery, Magisk, Root, ADB, Fastboot, Recovery Flash, 9008, Bypass FRP</a>)</p>
</li>
</ol>
</blockquote>
<h2><strong>Seven Detailed Ad Handling Methods:</strong></h2>
<h3><strong>1. Reverse Engineering Modification: Complete Code-Level Removal</strong></h3>
<p><strong>Decompile</strong> the APK file, locate and <strong>remove ad code, splash screens</strong>, or <strong>modify layout files</strong> to remove ad banners, eliminating all in-app ads at once.</p>
<p>Such modified installation packages, known as "<strong>green versions</strong>" or "<strong>clean versions</strong>," were once very popular.</p>
<p>You can try searching for "app name + no ads/clean version"; you might find a surprise, but times have changed, so be careful of Trojans, viruses, and phishing software. If you have the time and energy, you can go to the technical sections of certain forums or "Geek Hall" to learn how to "greenify" apps yourself.</p>
<p><img src="https://img.sayori.org/blog/v1/dd5bcabba494749f69c47553969685112f97a610029b60383dfe48f0706671a6/1280.webp" alt="原文配图 12" /></p>
<blockquote>
<p>Pros: Permanently removes app ads</p>
<p>Cons: Cannot update; official versions might disable old versions</p>
</blockquote>
<h3><strong>2. Automated Click Tools: Simulating User Clicks to Skip Splash Ads</strong></h3>
<p>Utilizes <strong>accessibility features to monitor changes in interface elements</strong>. When text features or resource IDs of "X," "Skip," or "Close" buttons are identified, it <strong>automatically simulates user click behavior</strong>. The effect is immediate.</p>
<p>I highly recommend "Gao Kuai Dian" (literally "Hurry Up"). Rules can be obtained from platforms like GitHub.</p>
<p><img src="https://img.sayori.org/blog/v1/f300f50d4ca0fce77be04fdd48da4a954f1fb6106be99bd44ac7c7188c390cf6/1280.webp" alt="原文配图 13" /></p>
<h4>Gao Kuai Dian</h4>
<blockquote>
<p>Pros: Immediate effect</p>
<p>Cons: Running in the background increases power consumption; ineffective if the process is killed</p>
</blockquote>
<h3><strong>3. Permission Control: Preventing Shake-to-Ad Triggers</strong></h3>
<p>Shake-to-ad was so annoying that after being called out by CCTV, it became a bit more restrained. Later, phone manufacturers implemented permission controls.</p>
<p>Shake-to-ad relies on the "access device motion and orientation" permission. By directly disabling this permission through system settings, you can prevent shake-to-ad from triggering.</p>
<p><strong>Illustrated Tutorial</strong></p>
<p><img src="https://img.sayori.org/blog/v1/d62372e665276fd3e3b1d8c5e9011cee9d933536ac5d10c3006421a0a08605d0/1280.webp" alt="原文配图 14" /></p>
<p><img src="https://img.sayori.org/blog/v1/7d85fe796a471fbfcc82a4fb87e4aa5a1879b33522ed63aef3308b11530d7c87/1280.webp" alt="原文配图 15" /></p>
<p><strong>Text Tutorial</strong></p>
<blockquote>
<p><strong>Operation method</strong>: Go to System Settings → App Management → Find the app you want to disable shake-to-ad for → Permission Management → Find and disable "Access device motion and orientation" or "Sensors" permission</p>
</blockquote>
<blockquote>
<p>Pros: No extra tools needed</p>
<p>Cons: Ads still exist, just won't trigger accidentally; requires manual setup for each app, which is tedious</p>
</blockquote>
<h3><strong>4. AdGuard: Intercepting Ad Requests</strong></h3>
<p>Intercepts all <strong>network requests</strong> via a <strong>local proxy</strong>. When an ad rule is matched, it blocks the request or returns empty data, <strong>intercepting ad content before it loads</strong>.</p>
<p><img src="https://img.sayori.org/blog/v1/1751904390b902bf01352fbb5debdf5cab27b6e592ba2967795d37002eea78ef/1280.webp" alt="原文配图 16" /></p>
<p>What's the benefit of this? It can <strong>intercept</strong> feed ads disguised as Moments posts, <strong>feed ads</strong> disguised as comments, and so on.</p>
<p><strong>Theoretically</strong>, it can <strong>kill</strong> any ad. Similar tools include AdAway.</p>
<blockquote>
<p>Pros: Wide coverage, supports various ad formats</p>
<p>Cons: Runs in the background, increases power consumption; slows down network speed</p>
</blockquote>
<h3><strong>5. Root &amp; Plugins: System-Level Ad Blocking</strong></h3>
<p>Rooting your phone gives you <strong>supreme system control</strong>, allowing you to <strong>block ad domain resolution and requests</strong> using <strong>Hosts redirection</strong> and <strong>firewall</strong> rules.</p>
<p>I recommend using AdAway's root mode to modify the Hosts file and block ad domains. The software is open-source, and there are plenty of rule sources shared by experts on GitHub.</p>
<p><img src="https://img.sayori.org/blog/v1/955b32469c947c48c580c2d3f1ba6580eb4fad6c45f566f59354b9d853ba90ba/984.webp" alt="原文配图 17" /></p>
<p>For <strong>plugins</strong>, I recommend the <strong>AdGuardHome module</strong> from the top experts on Xiaolvshu (Little Green Book).</p>
<p><img src="https://img.sayori.org/blog/v1/cef6360e6bf38f0859ba2a3a1d0229062a97ff37e6b0c3c646b49ab44b5f8748/875.webp" alt="原文配图 18" /></p>
<blockquote>
<p>Pros: One-time setup, global effect; most thorough results</p>
<p>Cons: Rooting is complex, with a risk of bricking; banking apps may detect root and refuse to run</p>
</blockquote>
<h3><strong>6. LSPatch Patching: A Modular Solution Without Root</strong></h3>
<p>Use wireless debugging to start <strong>Shizuku</strong>, then authorize the <strong>LSPatch</strong> tool. After that, <strong>package Xposed modules</strong> directly <strong>into APK</strong> files, achieving <strong>module functionality injection</strong> without root.</p>
<blockquote>
<p>Requires modules to support patching mode</p>
</blockquote>
<p><strong>Steps:</strong></p>
<p>Get original APK and ad-blocking module → Start Shizuku via wireless debugging → Authorize and patch with LSPatch → Install patched APK</p>
<p><img src="https://img.sayori.org/blog/v1/aab6d24ac3f36822ce93e805ba371b8f88bae5afc5ee62d8761eb7b5ec39a53d/1280.webp" alt="原文配图 19" /></p>
<h4>Authorizing LSPatch with Shizuku</h4>
<blockquote>
<p>Pros: No root required, relatively safe</p>
<p>Cons: Each app needs individual handling; apps need re-patching after updates; may trigger signature verification causing crashes</p>
</blockquote>
<h3><strong>7. DNS Filtering: The Ultimate Solution Balancing Effectiveness and Ease of Use</strong></h3>
<p>Among all ad-blocking methods, this is the one I recommend the most.</p>
<p><strong>Just enter a URL on your phone, and you can get rid of 95% of those pesky app ads!</strong></p>
<p><img src="https://img.sayori.org/blog/v1/54942bdd9ec952f05969babc234f0aff502bce0e6fa0a2f08ce4cb2e6a138455/1280.webp" alt="原文配图 20" /></p>
<p>DNS providers set up ad domain blacklists on their servers. Once users configure DNS on their smart devices (phones, tablets, PCs), when the device queries these ad domains, it will receive an incorrect IP (like 0.0.0.0) or a local IP, preventing ads from loading. This achieves the ad-blocking effect.</p>
<p>This is similar to AdGuard and AdAway's local proxy modes, as both apps use DNS filtering for ad blocking.</p>
<p>And since Android 9+ comes with a <strong>Private DNS feature</strong>, instead of using apps that need to run in the background, it's better to directly use the phone's native DNS function for filtering.</p>
<blockquote>
<p><strong>Configuration Method:</strong></p>
<p>Go to System Settings → Network &amp; Internet → Private DNS → Select 'Private DNS provider hostname' → Enter DNS service address</p>
</blockquote>
<p><img src="https://img.sayori.org/blog/v1/dc268fd64bf2c6bfaa91bbd5a590761eec7a8b6259416fb8fa8ad0423f4f8a1d/1280.webp" alt="原文配图 21" /></p>
<p><strong>For Android 9 and below, you can use Wi-Fi's DNS resolution.</strong></p>
<p><img src="https://img.sayori.org/blog/v1/ac98ad2cf9d6894ae43dcb81e99e7fdfd2750eee64d814c7640ae75730199faf/427.webp" alt="原文配图 22" />---</p>
<hr />
<blockquote>
<p>(Second update here 2026/07/01): Thanks to the experts in the comments for the additions</p>
<p><img src="https://img.sayori.org/blog/v1/67b889699f756abc31d941c3731542cfc8e95c7bd964ad187607a0a6d2caa0a8/1116.webp" alt="Original illustration 23" /></p>
</blockquote>
<h2>Currently available DNS: 2026.dns1.top</h2>
<p>Third update: Comment section speaks from experience
<img src="https://img.sayori.org/blog/v1/82b85730add0713b6dfe4a06268006c5619dbfe586671d3764f9e2882bbc7cd9/1172.webp" alt="Original illustration 24" /></p>
<hr />
<p>DNS filtering <strong>requires no app installation</strong>, is simple to operate, and once configured, <strong>takes effect globally</strong> across web pages and apps, consuming fewer phone resources while achieving almost the same results as apps like AdGuard and AdAway.</p>
<blockquote>
<p>Pros: No app installation required, global effect on web pages and apps</p>
<p>Cons: A few stubborn ads might slip through, false positives can occur, sometimes slows down internet speed</p>
</blockquote>
<blockquote>
<h1>To attract more technical personnel to join the analysis, expose rogue ads/apps/big data price discrimination, and optimize the domestic app ecosystem</h1>
<h1>I hereby voluntarily relinquish all copyrights to this article.</h1>
<h1>Effective immediately, anyone may <strong>freely repost, modify, or transfer this article, no attribution or authorization required</strong></h1>
</blockquote>
<blockquote>
<p>The author's tip jar from the original post has not been replicated here; if you wish to support the author, please visit the original post</p>
</blockquote>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Internet & Community"></category>
  </entry>
  <entry>
    <title>(Repost) An Insider Reveals How Rogue Apps Trap and Hunt Users</title>
    <link href="https://blog.sayori.org/en/posts/rogue-app-advertising-user-traps/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/rogue-app-advertising-user-traps/</id>
    <published>2026-07-23T00:00:00.000Z</published>
    <updated>2026-07-23T00:00:00.000Z</updated>
    <summary>Reposted with original author's permission, detailing common rogue app tactics in ad redirects, user profiling, permission bypasses, risk control evasion, and complaint interception.</summary>
    <content type="html"><![CDATA[<p>&lt;details class="repost-source"&gt;
&lt;summary&gt;Original Post &amp; Authorization&lt;/summary&gt;
&lt;p&gt;Original: &lt;a href="https://linux.do/t/topic/2161543"&gt;https://linux.do/t/topic/2161543&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Authorized by the original author&lt;/p&gt;
&lt;/details&gt;</p>
<p>I've been on linux.do for a while now, and I hope to bring some useful information to everyone. Thanks!</p>
<h1>Revealing How Rogue Apps Trap and Hunt Users</h1>
<blockquote>
<p><em><strong>To attract more technical personnel to join the analysis and expose the behavior of rogue software, I voluntarily waive all copyrights to this article. Anyone can freely repost, modify, or move this article without authorization or attribution.</strong></em></p>
</blockquote>
<p>Originally, I just wanted to write about how a certain app was rogue and bypassed store reviews, but then I found out this wasn't an isolated case. So I stopped my analysis and instead wrote my own app to verify my ideas, to help everyone better understand these phenomena. Now, as an industry insider and mobile software developer, through a bit of self-reflection and experimentation, I've compiled these key points and their solutions.</p>
<blockquote>
<h4><em>From here on, I'll expose industry truths from a first-person perspective:</em></h4>
</blockquote>
<h2>I. How do rogue merchants increase app ad conversion rates?</h2>
<p>Here are three common but unmentioned methods:</p>
<p>First, integrate the system vendor's built-in ad SDKs. These "downloaders" have special permissions that allow them to silently download and install apps from the app store. (Users cannot disable the app store's silent download and installation permissions.)</p>
<p>A few years ago, I even found that even with "guardian mode" (which prohibits app installation) enabled, such ads could still silently install apps.</p>
<p><img src="https://img.sayori.org/blog/v1/28d8d87379aed6972820386ec2d90d3285e12e87887ee7ab83fced5c36bfe3a6/original.gif" alt="Original image 1" /></p>
<p>Clicking the close button automatically downloads and installs the promoted app. This capability comes from the manufacturer's own ad SDK.</p>
<p>Second, ads expand to full screen, and when the user brings up the virtual navigation bar (the "white bar"), it will 100% jump to the ad page.</p>
<p>This way, users will only think they accidentally swiped and tapped it.</p>
<p>In reality, the ad page monitors the navigation bar; if the navigation bar appears, it means the user has swiped, and it immediately jumps screens.</p>
<p>Initially, I guessed that the "release" action of the swipe was captured by the app ad page as a click. However, bringing up the white bar is actually intercepted by the system, and the app cannot detect where the user released their finger.</p>
<p><img src="https://img.sayori.org/blog/v1/ae0dafac99b1799843deb6a39dd9aeacaba804737da6eb37c8bdf5274b7a60cb/original.gif" alt="Original image 2" /></p>
<p>Notice the swipe trajectory, no extra clicks.</p>
<p>The third type is "screen-switching ads." After a user switches out of the app for a period, when they return, a splash-screen-like ad page pops up.</p>
<blockquote>
<p>Users often mistakenly think it's due to insufficient phone memory, causing the app to be automatically cleared from the background.</p>
</blockquote>
<p>These situations are too common for me to bother with screenshots.</p>
<p>Other non-technical ad tricks, such as stacking multiple layers of ads or using dark backgrounds to obscure semi-transparent close buttons, will not be discussed here for now.</p>
<h2>II. Can we further increase ad reach?</h2>
<blockquote>
<p>A simple way is to let users use our app for a while, draw a heatmap to find frequently tapped areas, and then swap the "skip ad" and "enter" button positions.</p>
<p>If we don't want users to quickly notice this trick, we can change the ad type, style, and button size, so users don't consciously perceive it but their muscle memory is affected.</p>
</blockquote>
<p><img src="https://img.sayori.org/blog/v1/dfa4a531ef64922bc9659bc42d9f568faac4c6ae6f9d146b275d42672bea5e57/1280.webp" alt="Original image 3" /></p>
<p>This image is from Baidu Mobile Analytics SDK.</p>
<h2>III. How to distinguish between seniors and kids for precise targeting?</h2>
<p>Seniors and children are two silent groups, and their behavioral characteristics are distinct.</p>
<p>Senior characteristics:</p>
<p>The thinking time for each operation is significantly longer than for young people.</p>
<blockquote>
<p>For example, swipe operations (press, swipe, release) take &gt;500ms.</p>
</blockquote>
<p>They often have the "three big buttons" at the bottom.</p>
<blockquote>
<p>For example, by comparing the phone's screen size with the maximum display size within the app, we can determine if the user has enabled the navigation bar.</p>
</blockquote>
<blockquote>
<p>Their installed app list mostly consists of short dramas, short videos, "lite" versions, and audiobooks.</p>
<p>The system font scaling is set to "Large" or above.</p>
</blockquote>
<p>Kid characteristics:</p>
<p>Because their fingers are small, we can determine this by calculating the pressure area (not a single indicator to conclude it's a child).</p>
<p><img src="https://img.sayori.org/blog/v1/f5ed869d0d8379fbe505fd0828a5689e57b60e6f68770a8eb142aa88d8560860/original.gif" alt="Original image 4" /></p>
<p>First two times: thumb (adult); last two times: pinky (simulating a child).</p>
<blockquote>
<p>Their installed software mostly consists of games, and many are small games from the store.</p>
</blockquote>
<p>These are important parts of user profiling. As long as we accurately identify them as seniors or children, ads can be pushed to them without restriction.</p>
<h2>IV. What if the user denies permission to read the installed app list? Can we still get it?</h2>
<blockquote>
<h2><strong>Here's a point: users often think that if they deny permission, it won't be read, but it can actually be bypassed!!!!!!!!!!!!!!! (So, if you have any external software on your phone, anti-fraud can call you, of course, to advise you not to do bad things.)</strong></h2>
</blockquote>
<p>As shown:</p>
<p><img src="https://img.sayori.org/blog/v1/46341710d6f93186019d5273d74d0609a38ac66eb9ccf25dc6026f045ca84c42/original.gif" alt="Original image 5" /></p>
<p>Even with app permissions denied, the app list can still be obtained by bypassing.</p>
<h2>V. What if someone captures packets?</h2>
<p>Detect proxies. As soon as a proxy is detected, change self-behavior (stop sending sensitive data, stop displaying rogue ads).</p>
<p><img src="https://img.sayori.org/blog/v1/d6383dfd6f447db51969dea9bd0a4dce0ac830dcdd1aa9cf0f4b9945af3cb48a/original.gif" alt="Original image 6" /></p>
<p>App behavior changes based on user's network environment.</p>
<p>What if someone tries to reverse-engineer the app?</p>
<p>The confrontation is endless. Obfuscation, hardening, and anti-packet capture are enough to deter general technical personnel from analyzing. Big shots won't bother with apps of our scale.</p>
<p>What if the app gets targeted?</p>
<p>If multiple parties target me, I'll just surrender, take it down to avoid the storm, then rename it and come back.</p>
<p>If that doesn't work, I'll reskin it and put it back on the market, having applied for backup licenses in advance.</p>
<p><img src="https://img.sayori.org/blog/v1/e80cc0d2e64effa9f4fa96fdb5099f3d3795ec596b97d17a1c29d3bf41a58f4c/541.webp" alt="Original image 7" /></p>
<p>This is an example image, unrelated to this article.</p>
<blockquote>
<p>What if a user wants to uninstall? How do we retain them?</p>
<p>Users habitually long-press the icon to uninstall, so we can add a fake uninstall entry to mislead them.</p>
<p>Then, upon entering, we send out some benefits to retain the user.</p>
</blockquote>
<p><img src="https://img.sayori.org/blog/v1/7bd42f65fb38bd63a2c8b2ab64f7e67f430ead2dd52360312e368fb8902baddc/original.gif" alt="Original image 8" /></p>
<p>Fake uninstall entry in quick menu to divert users.</p>
<p>VI. What if a user wants to complain about us?</p>
<blockquote>
<p>For example, for the ads we integrate, we can put a</p>
<p><strong>fake complaint</strong> button that directs complaints to <strong>our own platform</strong>.</p>
<p>And also put a <strong>complaint feedback</strong> in the app's personal center.</p>
<p>Interception is an efficient method. We provide a dedicated "green remote control" channel for these users.</p>
</blockquote>
<blockquote>
<p><img src="https://img.sayori.org/blog/v1/a8bba1353d818d2f3a39604e17768f35a6d7d0298be860046ecd92070c5bc54c/846.webp" alt="Original image 9" /></p>
</blockquote>
<p>Complaint interception.</p>
<h2>VII. If a user records the screen to expose us online, can we stop it?</h2>
<p>There's no interface to detect floating windows, but we can infer whether screen recording might be active by observing the view update speed (frame rate) after in-app operations.</p>
<p><img src="https://img.sayori.org/blog/v1/c23822351b2924314d01779b70ffa28b03b511a072fc626b88a0f72795ddfb5f/original.gif" alt="Original image 10" /></p>
<p>After screen recording is enabled, operation frames will fluctuate significantly.</p>
<p>I've tested playing 4K videos in floating windows and such, and they don't affect the in-app operation frame rate.</p>
<blockquote>
<p>Only screen recording shows a significant frame drop as pictured. I reserve my opinion on this detection method; it's just an example.</p>
<p>Regarding preventing screen recording and screenshots, you can actually just call system interfaces to prohibit them directly, which is simple and crude. We can find an excuse like "Due to copyright considerations, this app prohibits screenshots and screen recording." You see many apps, even mini-programs, are starting to abuse this feature.</p>
</blockquote>
<p><img src="https://img.sayori.org/blog/v1/fc39a74804b862ab0e4059e1d60bf000d278a2a1cd184b0fe8fed9c18dd737e3/original.gif" alt="Original image 11" /></p>
<p>Screenshots and screen recording are prohibited; forced recording results in a black screen.</p>
<h2>VIII. How do we bypass manual review when submitting to app stores?</h2>
<p>Reviewers' Android virtual machines and phones have specific apps. We just need to detect these specific apps, and if they exist, open a "green channel."</p>
<blockquote>
<p>Also, don't mess with lawyers; they're tough to deal with. For example, during development, we can detect if lawyers' commonly used "Truth Verification" app (com.truthso.ip360.activity) is on the phone to make our app stay silent. Similar cases involve sensitive individuals, like those in cybersecurity or public security departments—you know who I mean.</p>
</blockquote>
<p>Remote control delivers configuration whitelist.</p>
<p><img src="https://img.sayori.org/blog/v1/df622254dda211e57401cd4f6e68201c186a046be70c5acf75d29952044474c1/462.webp" alt="Original image 12" /></p>
<h2>IX. How do we bypass review by the people at the very top?</h2>
<p>We can combine multiple methods, detecting IPs in key cities like Beijing, Shanghai, and Guangzhou, and delivering remote control configurations specifically for them.</p>
<blockquote>
<p>Detect business-oriented, high-end, or specially customized phone models, and randomly deliver packages (the people at the top wouldn't be using Redmi or Honor, right?), making reproduction more difficult (but I don't want to cut off everyone; high-end users are also our target).</p>
</blockquote>
<p>I spent a lot of time collecting, reverse-engineering, analyzing, and writing code to verify, not to learn how to become such a villain, but to expose these malicious acts hidden deep in the code to the public.</p>
<p>When commercial interests become the sole driving force, technology ceases to be a tool that serves people and instead becomes a shackles that manipulates them.</p>
<p>Endless probing of boundaries is eroding the trust of the entire mobile internet ecosystem.</p>
<p><em><strong>Technology should be used for good, not as a weapon to hunt users.</strong></em></p>
<p><em><strong>Return to friendly advertising, uphold human decency.</strong></em></p>
<blockquote>
<p>Here are some related development resources (replace # with .). Those interested can check them out:</p>
<p>Android API documentation:</p>
<p>developer#android.google#cn/reference/packages</p>
<p>Method to bypass app list permission to get app list:</p>
<p>github#com/LuoYunXi0407/AppListViewer</p>
</blockquote>
<blockquote>
<h4>Now, after learning so many rogue software tricks, you should have a pretty good idea, right? Not to mention those obscure small software not listed in app stores; they're even more disgusting than what's mentioned above. This is the reality of the domestic app ecosystem, <strong>so, everyone, try not to download software from unknown sources.</strong></h4>
<p><strong>If you have parents who aren't tech-savvy, or elderly/children at home, it's best to enable the phone's built-in software manager to block things for them! (Unless otherwise needed, it's best to lock down third-party installation permissions and payment permissions, or simply not bind payment cards.)</strong></p>
<p>Also, a quick note: if you encounter app keywords like:</p>
<p>Cracked version, VIP unlock, live stream, big show, NSFW software, movie-watching software, adult, local dating, video chat, unknown VPN software, dating, investment and finance, betting, gambling...</p>
<p>Then what's behind these isn't just privacy theft; it's very likely some Southeast Asian gray industry or criminal gang. Someone on this site has also exposed similar scams: <a href="https://linux.do/t/topic/205802?u=aichitangcupaigu">https://linux.do/t/topic/205802?u=aichitangcupaigu</a></p>
</blockquote>
<blockquote>
<p>The original post included a forum poll here; the options are preserved below.</p>
</blockquote>
<h2>Have you encountered these rogue apps?</h2>
<ul>
<li>Yes, I knew at the time, and didn't download after finding out.</li>
<li>Yes, I knew at the time, but still wanted to check it out and installed it.</li>
<li>Yes, I didn't know at the time, downloaded and tried it.</li>
<li>No, I usually only download software from official channels / I am an iOS user.</li>
</ul>
<h4><strong>Thanks for your enthusiastic likes and rockets, fellow users! If you have any questions, feel free to ask in the comments, and I will respond as appropriate.</strong></h4>
<blockquote>
<p>The author's donation link in the original post is not replicated here. If you wish to support the author, please visit the original post.</p>
</blockquote>
<p>Hope this article helps everyone protect themselves, their elderly family members, and children!</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Internet & Communities"></category>
  </entry>
  <entry>
    <title>Internet Community Records 2: Bangumi, Doki Chinese Club, and South Plus</title>
    <link href="https://blog.sayori.org/en/posts/internet-community-2-bangumi-and-doki/internet-community-2/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/internet-community-2-bangumi-and-doki/internet-community-2/</id>
    <published>2026-07-11T00:00:00.000Z</published>
    <updated>2026-07-13T00:00:00.000Z</updated>
    <summary>From Bangumi's entries and discussions, to the Doki Chinese Club forum I first joined, and finally a quick mention of South Plus.</summary>
    <content type="html"><![CDATA[<p>I mentioned Doki in the previous post about Linux.do and NodeLoc, but I hadn't figured out how to write about it then. After thinking about it recently, I realized these can all be considered ACG forums, so I'll just record them all for now.</p>
<h2>Bangumi</h2>
<p>Entry point: <a href="https://bangumi.tv/">https://bangumi.tv/</a></p>
<p>My account: <a href="https://bangumi.tv/user/amiya_desi">https://bangumi.tv/user/amiya_desi</a></p>
<p>I first saw Bangumi mentioned in the profile of a kind soul running a public service site on L-station, and that's when I realized there was such a holy land for ACG. I really was out of touch before, never knew there were so many communities online. I remembered it, but only just now got around to registering an account and being active there, haha.</p>
<blockquote>
<p>[!NOTE]
<strong>Bangumi (番组计划, bangumi.tv) is a Chinese interest community + media database centered around ACGN (Animation, Comics, Games, Novels, etc.).</strong></p>
<p>It primarily serves Chinese users, offering features for cataloging works, tracking progress, rating and reviewing, managing collections, and discussions. It's similar to MyAnimeList / AniList in the Chinese sphere, but with a broader scope (anime, manga, games, books, music, etc.) and strong community aspects.</p>
<p>Key Features</p>
<ul>
<li><strong>Work Database and Progress Management</strong>: Users can record watch/read/play progress, rate, write short/long reviews, tag, and create collections.</li>
<li><strong>Community and Discussion</strong>: Features like entry discussions, groups, and logs facilitate communication among enthusiasts.</li>
<li><strong>User-driven and Relatively "Hardcore"</strong>: The overall atmosphere is interest-driven, emphasizing the quality of records and evaluations. Users are often deep ACG enthusiasts, discussions are relatively serious, and it has its own memes and culture.</li>
<li><strong>Social Features</strong>: Friends, timelines, groups, etc., allow for the formation of small circles for interaction.</li>
</ul>
</blockquote>
<h3>Grok4.5's One-Sentence Summary</h3>
<p>It is a <strong>Chinese ACGN enthusiast platform centered on work cataloging and ratings, with integrated community discussions</strong>, suitable for both personal organization of "watched/watching/want to watch" lists and for finding like-minded individuals to interact with.</p>
<blockquote>
<p>[!NOTE]
Bangumi is not a site for tracking ongoing anime; it's mainly for cataloging entries, rating, and viewing discussions. The first time you visit, just click on a few entries and groups; it's faster than reading a long introduction.</p>
</blockquote>
<p><strong>Note</strong>: It is not an entertainment news portal or a bullet-comment video site, but rather a community focused on "collection + evaluation + interest-based social interaction." The site's content is primarily user-contributed and organized.</p>
<h3>My Experience</h3>
<p>The ACG content there is indeed hardcore, and it gathers a ton of works. After I joined, I also posted a small thread, an AI-summarized self-introduction, and then joined a <a href="https://bangumi.tv/dev/app/4337">https://bangumi.tv/dev/app/4337</a>. I chatted a bit there, and indeed, there are many amazing folks! As expected, we ACG fans are all super awesome, hahaha.</p>
<h2>Doki Chinese Club</h2>
<p>Entry point: <a href="https://forum.monika.love/">https://forum.monika.love/</a></p>
<p>My account: <a href="https://forum.monika.love/u/40422">Amiya_desi - Doki Chinese Club</a></p>
<p>I joined this community in April after encountering <em>Doki Doki Literature Club!</em>, and it was my first time experiencing something like a community. It seems that domestically, this community is more commonly called 'Mopan' (Monika's Drive), mainly because it's used to download DDLC fan games and distribute personal resources. My original <code>ddlc解包的素材</code> was also obtained from here, and the <code>blus skies</code> I played was downloaded here, as well as resources related to the famous <code>mas（monika after story）</code>.</p>
<blockquote>
<p>[!NOTE]
<code>Doki Chinese Club</code> is a Chinese player/fan community themed around <code>《Doki Doki Literature Club!》</code> (Doki Doki Literature Club / DDLC).</p>
<p>It primarily serves Chinese users, gathering fans who love this psychological horror visual novel. Common activities include:</p>
<ul>
<li>Discussing game plot, characters (Monika, Sayori, Yuri, Natsuki, etc.), and hidden elements.</li>
<li>Sharing fan art, fan fiction, cosplay, handmade crafts, and other secondary creations.</li>
<li>Exchanging official and fan-made Chinese translations, mods, revisions/versions, music, and theoretical analyses.</li>
<li>Related memes, emojis, and light role-playing/Literature Club-style interactions.</li>
</ul>
</blockquote>
<blockquote>
<p>[!NOTE]
Doki is mainly for DDLC mods, fan works, and resource exchange. Before downloading or posting, check the categories, pinned posts, and instructions.</p>
</blockquote>
<h2>South Plus</h2>
<p>Entry point: <a href="https://bbs.imoutolove.me/index.php?">https://bbs.imoutolove.me/index.php?</a></p>
<p>My account: It's just Amiya_desi, that's all, mhm.</p>
<p>There are quite a lot of R18 resources. <a href="https://www.south-plus.net/plugin.php?H_name-tasks.html">Community Forum Tasks South+ South Plus - powered by Pu!mdHd</a> is where you can get forum currency to buy some of <em>those</em> resources. Yeah, there are indeed many R18 resources here, and all sorts of strange R18 short stories.</p>
<p>There are also some net-earning sections for cloud drives here. If you're doing that yourself and have these kinds of resources, you could try contributing them here.</p>
<blockquote>
<p>[!NOTE]
<strong>South Plus (南+ / 南加) is a Chinese online forum/community primarily focused on adult content.</strong>
It mainly serves Chinese users, with its core being the sharing and discussion of adult-oriented content, including:</p>
<ul>
<li>Sharing adult videos, images, novels, and other resources.</li>
<li>Discussions on related topics (fetishes, experiences, resource exchange, etc.).</li>
<li>It sometimes also covers sections like anime, games, and lifestyle, but the overall focus remains adult content.</li>
</ul>
<p>Its characteristics are roughly as follows:</p>
<ul>
<li><strong>Adult-oriented / NSFW Community</strong>: The content scale is quite large, making it a typical "porn site" forum.</li>
<li><strong>Resource-driven</strong>: Users primarily share, seek, and discuss adult content.</li>
<li>It has a certain reputation within the adult/underground circles of the Chinese internet but is a niche and content-sensitive community.</li>
</ul>
</blockquote>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Internet and Community"></category>
  </entry>
  <entry>
    <title>I Made a Small Forum List Repository</title>
    <link href="https://blog.sayori.org/en/posts/cn-internet-community-map/internet-community-map/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/cn-internet-community-map/internet-community-map/</id>
    <published>2026-06-18T00:00:00.000Z</published>
    <updated>2026-07-11T00:00:00.000Z</updated>
    <summary>I've organized my previously scattered notes on internet communities into a wiki-style small forum list repository and a standalone site. PRs are welcome!</summary>
    <content type="html"><![CDATA[<h1>I Made a Small Forum List Repository</h1>
<p>I've always wanted to put together a map of internet communities.</p>
<p>I'm not talking about the obvious big platforms like X, Instagram, Tieba, Xiaohongshu, or Xiaoheihou. I mean those forums and communities you'd rarely stumble upon unless you actively search for them or are already part of their specific circles.</p>
<p>This idea has now evolved from a single article into a standalone, long-term maintainable repository and an online page:</p>
<ul>
<li>GitHub Repository: <a href="https://github.com/Amiyadesi/small-forums-list">https://github.com/Amiyadesi/small-forums-list</a></li>
<li>Online Page: <a href="https://forums.cc.cd/">https://forums.cc.cd/</a></li>
</ul>
<p>Currently, this site is more like a wiki or docs: categories and community directories on the left, specific entries in the middle, each community has its own page, and there's a Giscus comment section at the bottom of each page.</p>
<p>The first version currently includes 49 communities. This number will continue to change as people add, correct, or submit PRs.</p>
<h2>What This Repository Includes</h2>
<p>Here, 'small' isn't strictly about user count, but about how you discover them.</p>
<p>If a community is basically inaccessible without actively searching, or if it's only frequently seen by people involved in the hosting, ACG, security, hardware, webmaster, or resource circles, then it might be suitable for inclusion.</p>
<p>Currently, it's roughly divided into these categories:</p>
<ul>
<li>Tech / AI / Developers</li>
<li>Hosting / VPS / Webmasters / Indie Sites</li>
<li>Search / Resources / Knowledge Tools</li>
<li>Security / Reverse Engineering / Systems / Software</li>
<li>ACG / Gaming / Niche Communities</li>
<li>Hardware / Electronics / Homelab</li>
<li>Adult / Resources / Gray Area</li>
<li>Old Overseas Forums / General Interest</li>
</ul>
<p>Although these categories feel a bit strange, it'll have to do for now.</p>
<h2>What the Current Page Looks Like</h2>
<p>Before, it was more like a long README list; now it's been broken down into a full site.</p>
<p>The homepage will keep a category overview, great for quickly seeing what communities are available; the left-hand directory is good for jumping by category; each community also has its own page, making it easy for others to point out if something is wrong, an entry point has changed, or registration rules have shifted.</p>
<p>I initially wanted to create an 'Internet Community Map,' but the more I wrote, the more I realized the hardest part isn't drawing the map, but continuously maintaining it.</p>
<p>Forum entry points change, registration methods change, and community vibes change. The hosting scene constantly gets new info due to vendors, routes, and events, and ACG and resource communities often become outdated because of domain, permission, or rule changes.</p>
<p>So, the current approach is: the repository handles the directory and factual records, while the blog covers personal experiences.</p>
<p>If I've genuinely been active in a community for a long time, I'll write a separate article. If it's just a compilation of public information, it stays on the list.</p>
<h2>What Each Community Entry Will Include</h2>
<p>Each entry in the repository will try to include this information:</p>
<ul>
<li>Entry Point</li>
<li>Positioning and Community Vibe</li>
<li>Registration Method or Barrier</li>
<li>What's Primarily Inside</li>
<li>What It's Good For</li>
<li>Important Notes</li>
<li>Public Sources</li>
<li>Last Verified Date</li>
</ul>
<p>For communities I've personally experienced long-term, the descriptions will reflect more genuine feelings.</p>
<p>For example, for Linux.do and NodeLoc, I'll draw from my experiences in my previous post <a href="/posts/internet-community-1/internet-community-1-en/">Internet Community Notes 1</a>: Linux.do's rules, beginner tasks, public welfare initiatives, perks and freebies, development optimization, collaborative documentation, LDC; NodeLoc's free atmosphere, sub-forums, battery points, AFF, and webmaster activity.</p>
<p>For communities I haven't used long-term, I'll only compile information from public pages and insider discussions, without pretending it's a personal experience.</p>
<h2>Why PRs Are Welcome</h2>
<p>A list like this is bound to have errors if only one person maintains it.</p>
<p>For some communities, outsiders can only see the entrance, not the true atmosphere. Some forums have periodically open registration, some domains drift, and some old and new names are easily confused.</p>
<p>Therefore, what this repository needs most isn't prettier descriptions, but corrections from actual community members.</p>
<p>If you're an old user of a community, or just notice an entry is wrong, you can directly submit a PR. The most valuable additions are usually these:</p>
<ul>
<li>Is registration currently open, invite-only, or periodically open?</li>
<li>Which rules or announcements should new users check first?</li>
<li>Is the community's true vibe more tech-oriented, chatty, trade-focused, or resource-driven?</li>
<li>What are the most valuable sections inside?</li>
<li>Has the entry point changed, or is the old domain unstable?</li>
<li>Do some descriptions sound too much like an AI summary and need to be rephrased in a real user's voice?</li>
</ul>
<p>If you don't want to submit a PR, you can also leave a comment directly on the corresponding community page. The site now uses Giscus, and comments will go into GitHub Discussions.</p>
<h2>How to Help Organize</h2>
<p>When adding or modifying a community, prioritize changing the structured data in the repository:</p>
<pre><code>data/communities.json
</code></pre>
<p>After making changes, run:</p>
<pre><code>node scripts/generate-readme.mjs
node scripts/build-site.mjs
</code></pre>
<p>The former syncs the README, and the latter generates the online page.</p>
<p>If you're just changing category descriptions, see:</p>
<pre><code>docs/categories.md
</code></pre>
<p>If you're adding a single community, it's best to also provide public sources. Sources can be the official website, registration page, in-site announcements, about page, rules page, or any other publicly accessible documentation.</p>
<h2>Current Organization Principles</h2>
<p>This project is currently organized primarily by AI based on public information, site pages, and a small amount of personal experience. Only a portion of the communities are ones I've genuinely entered and experienced long-term.</p>
<p>So, I hope that eventually, every community entry can be reviewed and corrected by real users.</p>
<p>Adult, resource, cracking, reverse engineering, security, flashing, and trading communities will also be included, but categorized clearly: what they generally contain, what to observe, and what pitfalls exist. Whether to enter, participate, or how to assess risks is entirely the reader's responsibility.</p>
<p>I now want to make this a public directory that can be continuously updated, rather than a blog post that becomes outdated once written.</p>
<p>If you find a forum I haven't listed, or an entry that's clearly written by an outsider, feel free to submit a PR directly to the repository:</p>
<p><a href="https://github.com/Amiyadesi/small-forums-list">https://github.com/Amiyadesi/small-forums-list</a></p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Internet & Communities"></category>
  </entry>
  <entry>
    <title>Webmaster Resource Toolbox</title>
    <link href="https://blog.sayori.org/en/posts/blog-resource-toolbox/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/blog-resource-toolbox/</id>
    <published>2026-06-23T00:00:00.000Z</published>
    <updated>2026-07-07T00:00:00.000Z</updated>
    <summary>External resource entry points for domains, hosting, comments, monitoring, self-hosting, Cloudflare, analytics, webmaster communities, and blog frameworks.</summary>
    <content type="html"><![CDATA[<p>This post only lists external resource links.</p>
<p>To learn how to read articles on this site, see <a href="/posts/site-article-index/site-article-index-en/">Site Article Index</a>.</p>
<p>For commonly used local software, see <a href="/posts/useful-free-software-toolbox/useful-free-software-toolbox-en/">Useful Free Software List</a>.</p>
<p>Rules and free tiers can change, so always check the official website before signing up.</p>
<h2>GitHub List Repositories</h2>
<ul>
<li><a href="https://free-for.dev/#/">Free for Developers</a>: Collection of free services for developers, 100k+ GitHub stars.</li>
<li><a href="https://github.com/zhuima/awesome-cloudflare">awesome-cloudflare</a>: Collection of Cloudflare uses, 10k+ GitHub stars.</li>
<li><a href="https://github.com/sindresorhus/awesome#readme">sindresorhus/awesome: 😎 Awesome lists about all kinds of interesting topics</a>: Awesome lists post, 400k+ GitHub stars.</li>
</ul>
<h2>Free Domains and Temporary Entry Points</h2>
<ul>
<li><a href="https://my.dnshe.com/">DNSHE</a>: Free subdomain, good for practicing DNS first.</li>
<li><a href="https://nic.eu.org/">eu.org</a>: Classic free domain, but approval is often slow.</li>
<li><a href="https://nic.us.kg/">us.kg</a>: Also quite common, check current rules before registering.</li>
<li><a href="https://nic.ua/">pp.ua</a>: One of the established free domain entry points.</li>
<li><a href="https://pages.github.com/">GitHub Pages</a>: Will give you a <code>github.io</code>.</li>
<li><a href="https://pages.cloudflare.com/">Cloudflare Pages</a>: Will give you a <code>pages.dev</code>.</li>
</ul>
<p>If you're just starting a website, these should keep you busy for a while.</p>
<h2>Official Domain Registration</h2>
<ul>
<li><a href="https://www.namesilo.com/">Namesilo</a></li>
<li><a href="https://porkbun.com/">Porkbun</a></li>
<li><a href="https://www.cloudflare.com/products/registrar/">Cloudflare Registrar</a></li>
</ul>
<p>I personally prioritize checking the first-year price and renewal price, otherwise it's easy to get lured in by a low first-year cost.</p>
<h2>Static Hosting</h2>
<ul>
<li><a href="https://pages.cloudflare.com/">Cloudflare Pages</a>: I'm currently using it myself.</li>
<li><a href="https://vercel.com/">Vercel</a>: Many front-end projects are hosted here.</li>
<li><a href="https://www.netlify.com/">Netlify</a></li>
<li><a href="https://pages.github.com/">GitHub Pages</a></li>
<li><a href="https://render.com/">Render</a></li>
</ul>
<p>For a purely static blog, Cloudflare Pages and GitHub Pages are generally sufficient.</p>
<h2>Comment Systems</h2>
<ul>
<li><a href="https://giscus.app/">Giscus</a></li>
<li><a href="https://twikoo.js.org/">Twikoo</a></li>
<li><a href="https://artalk.js.org/">Artalk</a></li>
<li><a href="https://waline.js.org/">Waline</a></li>
<li><a href="https://cusdis.com/">Cusdis</a></li>
</ul>
<p>If you write a Chinese blog, I think Twikoo and Waline are more common.</p>
<h2>Monitoring and Status Pages</h2>
<ul>
<li><a href="https://gatus.io/">Gatus</a></li>
<li><a href="https://github.com/louislam/uptime-kuma">Uptime Kuma</a></li>
<li><a href="https://uptimerobot.com/">UptimeRobot</a></li>
<li><a href="https://betterstack.com/">Better Stack</a></li>
</ul>
<p>For self-hosting, I'd look at Uptime Kuma first; it saves a lot of hassle.</p>
<h2>Notifications and Push Services</h2>
<ul>
<li><a href="https://ntfy.sh/">ntfy</a></li>
<li><a href="https://github.com/Finb/Bark">Bark</a></li>
<li><a href="https://gotify.net/">Gotify</a></li>
<li><a href="https://github.com/easychen/pushdeer">PushDeer</a></li>
<li><a href="https://sct.ftqq.com/">Server 酱</a></li>
</ul>
<p>It's really quite necessary to send yourself a notification after a script runs.</p>
<h2>Self-hosting Resource Index</h2>
<ul>
<li><a href="https://awesome-selfhosted.net/">awesome-selfhosted</a></li>
<li><a href="https://github.com/awesome-selfhosted/awesome-selfhosted">awesome-selfhosted GitHub</a></li>
<li></li>
<li><a href="https://selfh.st/">selfh.st</a></li>
<li><a href="https://noted.lol/">noted.lol</a></li>
</ul>
<p>These are good to browse when you're not sure what to install.</p>
<h2>Cloudflare Related</h2>
<ul>
<li><a href="https://developers.cloudflare.com/">Cloudflare Docs</a></li>
<li><a href="https://developers.cloudflare.com/pages/">Pages Docs</a></li>
<li><a href="https://developers.cloudflare.com/workers/">Workers Docs</a></li>
<li><a href="https://developers.cloudflare.com/r2/">R2 Docs</a></li>
<li><a href="https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/">Tunnel Docs</a></li>
</ul>
<p>For something like Cloudflare, it's best to check the official documentation directly, otherwise community posts can quickly become outdated.</p>
<h2>Storage and CDN</h2>
<ul>
<li><a href="https://developers.cloudflare.com/r2/">Cloudflare R2</a></li>
<li><a href="https://www.backblaze.com/cloud-storage">Backblaze B2</a></li>
<li><a href="https://github.com/">GitHub Releases</a></li>
<li><a href="https://www.jsdelivr.com/">jsDelivr</a></li>
</ul>
<p>These are often used for image hosting, small files, and backup scenarios.</p>
<h2>Analytics</h2>
<ul>
<li>Cloudflare Web Analytics: Enable directly in Cloudflare dashboard.</li>
<li><a href="https://umami.is/">Umami</a></li>
<li><a href="https://plausible.io/">Plausible</a></li>
<li><a href="https://www.goatcounter.com/">GoatCounter</a></li>
</ul>
<p>I personally prefer Umami these days; the interface looks clean.</p>
<h2>Webmaster Communities and Directories</h2>
<ul>
<li><a href="https://www.travellings.cn/">开往 Travellings</a></li>
<li><a href="https://icp.gov.moe/">萌备</a></li>
<li><a href="https://www.foreverblog.cn/">十年之约</a></li>
<li><a href="https://hi.jiuchan.org/docs">揪蝉</a></li>
<li><a href="https://github.com/timqian/chinese-independent-blogs">中文独立博客列表</a></li>
<li><a href="https://bf.zzxworld.com/">BlogFinder</a></li>
<li><a href="https://www.boyouquan.com/">博友圈</a></li>
<li><a href="https://firewood.news/">积薪</a></li>
</ul>
<p>These are more like entry points you'd use to get your site out there after you've set it up.</p>
<h2>Forums and Tech Communities</h2>
<ul>
<li><a href="https://linux.do/">Linux DO</a></li>
<li><a href="https://www.v2ex.com/">V2EX</a></li>
<li><a href="https://www.nodeseek.com/">NodeSeek</a></li>
<li><a href="https://www.nodeloc.com/">NodeLoc</a></li>
<li><a href="https://news.ycombinator.com/">Hacker News</a></li>
</ul>
<p>If you want to see website building, VPS, freebies, and tinkering experiences, I often browse these myself.</p>
<h2>Blog Frameworks</h2>
<ul>
<li><a href="https://astro.build/">Astro</a></li>
<li><a href="https://gohugo.io/">Hugo</a></li>
<li><a href="https://hexo.io/">Hexo</a></li>
<li><a href="https://vitepress.dev/">VitePress</a></li>
<li><a href="https://www.getzola.org/">Zola</a></li>
</ul>
<p>I'm mainly using Astro right now, so I'm more familiar with it in this area.</p>
<h2>Passwords and Security</h2>
<ul>
<li><a href="https://github.com/dani-garcia/vaultwarden">Vaultwarden</a></li>
<li><a href="https://bitwarden.com/">Bitwarden</a></li>
<li>Cloudflare Access: Enable in Cloudflare dashboard.</li>
<li><a href="https://letsencrypt.org/">Let's Encrypt</a></li>
<li><a href="https://caddyserver.com/">Caddy</a></li>
</ul>
<p>Don't expose your admin panel directly to the public internet, and don't actually rely on memory for passwords.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>Build Your Own Search Gateway – My Search Gateway Upstreams</title>
    <link href="https://blog.sayori.org/en/posts/build-your-search-gateway/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/build-your-search-gateway/</id>
    <published>2026-07-05T00:00:00.000Z</published>
    <updated>2026-07-05T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<h1>Introduction</h1>
<p>I recently set up a custom MCP on my server to aggregate search and screenshot upstreams, creating my own custom search gateway. Here, I'll describe the gateway's structure and workflow, which is a FastAPI project running on the server.</p>
<h1>Search Upstreams</h1>
<h2>Exa</h2>
<p>https://exa.ai/pricing, where you can see the free tier offers 1000 searches per month. After linking a card, you also get a $7 monthly trial credit, plus an additional $20 after completing registration tasks. The search quality is basically the best.</p>
<p>It's suitable for semantic search in areas like technology, academic papers, and open-source projects. The quality is high, but you need to be mindful of your quota.</p>
<h2>Brave</h2>
<p><a href="https://brave.com/search/api/">Brave Search API | Brave</a>. Requires linking a card, which gives you a $5 search credit. You can set a spending limit to ensure you don't get charged. Search quality is decent.</p>
<p>It's suitable for general searches like official websites, news, blogs, and regular web pages, providing stable results.</p>
<h2>Travily</h2>
<p><a href="https://app.tavily.com/home">https://app.tavily.com/home</a>. Offers a generous 1000 searches per month. Registering multiple accounts is also quite convenient, though abuse is not recommended. Search quality is pretty good.</p>
<p>It's suitable for agent-based searches, recent information, and web content completion, fitting well with AI workflows.</p>
<h2>Firecrawl</h2>
<p><a href="https://firecrawl.org.cn/">https://firecrawl.org.cn/</a>. Provides 1000 credits per month for scraping pages into Markdown.</p>
<p>Its main job is to extract the main content from web pages; it's not suitable as a general search source.</p>
<h2>Grok-search</h2>
<p>GrokSearch Project Entry: <a href="https://github.com/GuDaStudio/GrokSearch">GuDaStudio/GrokSearch: Integrate Grok's powerful real-time search capabilities into Claude via the MCP protocol!</a>. I'm using it to integrate new Grok search capabilities.</p>
<p>Thanks to the public service sites within L-station, I've essentially achieved Grok freedom. Since search is what Grok is good for, I'm integrating it using the project from GitHub.</p>
<p>It's suitable for real-time news and querying new topics.</p>
<h1>SearXNG</h1>
<p><a href="https://github.com/searxng/searxng">https://github.com/searxng/searxng</a>, an open-source search engine project on GitHub. Its About section states: <code>SearXNG 是一个免费的互联网元搜索引擎，可汇总来自各种搜索服务和数据库的结果。用户既不会被跟踪，也不会被描述</code></p>
<p>It's good for self-hosted fallback, as it doesn't rely on commercial APIs. However, quality can vary between different instances.</p>
<h2>Other Free or Low-Cost Upstreams</h2>
<p>These can also be integrated:</p>
<ul>
<li>DuckDuckGo Instant Answer API: No key needed, suitable for lightweight entity queries</li>
<li>GitHub Search API: Great for searching open-source projects. A GitHub account can generate a token for more quota.</li>
<li>Stack Exchange API: For Stack Overflow Q&amp;A, keys are requested on Stack Apps.</li>
<li>Wikipedia and Wikidata: For encyclopedias and entities, no key needed.</li>
<li>Hacker News Algolia: For technical community discussions.</li>
<li>arXiv, OpenAlex, Crossref, PubMed, Semantic Scholar: For academic papers.</li>
<li>Internet Archive: For historical pages.</li>
<li>Common Crawl: For public indexes.</li>
</ul>
<p>These are not included in the default search.
For specialized questions, use specialized sources.</p>
<p>My search fallback order is basically: auto-select source by question type first. Technical questions go to Exa, real-time questions to Tavily or Grok, general web pages to Brave. Then, the fallback order is brave -&gt; tavily -&gt; exa -&gt; searxng.</p>
<h1>Screenshot Upstreams</h1>
<p><a href="https://github.com/xzulab/free-for-dev-zh#%E6%88%AA%E5%9B%BE-api">Free Developer Services: Screenshot APIs</a>. I basically registered for all of them listed there, so I'm pretty much covered. My AI's fallback order is essentially snapapi -&gt; apiflash -&gt; microlink -&gt; screenshotlayer -&gt; phantomjscloud -&gt; screenshotbase -&gt; screenshotscout -&gt; screenshotmachine -&gt; thumbnailws -&gt; hqapi.</p>
<h1>Price Comparison Upstream</h1>
<p>Tickerr Entry: <a href="https://tickerr.ai/mcp-server">https://tickerr.ai/mcp-server</a>. This can be used to get the latest prices for various AI services. However, I won't integrate it into my own gateway; I'll just connect to it when needed.</p>
<h1>My Workflow</h1>
<p>First, I use a general model to analyze the request, then call search and screenshot APIs based on the requirements. Finally, I use the model to output the search and screenshot results in JSON format. Local Redis also caches some content, and the exposed tools are categorized for various application scenarios.</p>
<p>Mind Map</p>
<pre><code>flowchart TD
  A["本地 AI 工具"] --&gt; B["MCP Adapter"]
  B --&gt; C["ssh sayori"]
  C --&gt; D["FastAPI 搜索网关"]
  D --&gt; E["Redis 缓存"]
  D --&gt; F["搜索 providers"]
  D --&gt; G["抓取和截图"]
  D --&gt; H["暴露工具"]

  F --&gt; F1["Exa 技术语义搜索"]
  F --&gt; F2["Brave 通用网页搜索"]
  F --&gt; F3["Travily Agent 搜索"]
  F --&gt; F4["GrokSearch 实时搜索"]
  F --&gt; F5["SearXNG 自建兜底"]

  G --&gt; G1["Firecrawl 抓 Markdown"]
  G --&gt; G2["截图 API 兜底"]

  H --&gt; H1["ai_search"]
  H --&gt; H2["ai_fetch_page"]
  H --&gt; H3["ai_screenshot"]
  H --&gt; H4["ai_analyze_url"]
  H --&gt; H5["ai_research"]
  H --&gt; H6["gateway_health"]

  F1 --&gt; I["搜索 fallback"]
  F2 --&gt; I
  F3 --&gt; I
  F4 --&gt; I
  F5 --&gt; I
  G2 --&gt; J["截图 fallback"]
</code></pre>
<p>Exposed Tools</p>
<ul>
<li><code>ai_search</code>: General search entry, defaults to 'auto' to let the gateway select upstreams by question type.</li>
<li><code>ai_fetch_page</code>: Scrapes the main content of a single web page, primarily relying on Firecrawl to convert it to Markdown.</li>
<li><code>ai_screenshot</code>: Actively takes a screenshot of a web page, suitable when the main content can't be scraped or when you need to see the page's state.</li>
<li><code>ai_analyze_url</code>: Scrapes a URL and then lets the model analyze it, suitable for reading documentation, announcements, or project pages.</li>
<li><code>ai_research</code>: Search, scrape, and summarize all-in-one, suitable for researching a topic.</li>
<li><code>gateway_health</code>: Checks if the remote gateway and various upstreams are currently configured correctly.</li>
</ul>
<h1>Summary</h1>
<p>This gateway essentially unifies search, scraping, screenshotting, and analysis into a single entry point.</p>
<p>All keys are stored on the server; local access is only via MCP calls.</p>
<p>General questions go through 'auto', specialized questions explicitly name the upstream, and failures trigger a fallback to another source.</p>
<p>This way, if one upstream goes down, it won't affect the entire AI search workflow.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building & Self-hosting"></category>
  </entry>
  <entry>
    <title>Very Useful Godot Plugins</title>
    <link href="https://blog.sayori.org/en/posts/godot-useful-plugins/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/godot-useful-plugins/</id>
    <published>2026-07-03T00:00:00.000Z</published>
    <updated>2026-07-03T00:00:00.000Z</updated>
    <summary></summary>
    <content type="html"><![CDATA[<h1>Intro</h1>
<p>Since I'm getting back into game development, let's first organize the battle gear! I'll list the plugins I frequently use in my projects here. The <a href="https://store.godotengine.org/">Godot Asset Store</a> is currently the official and latest plugin store, where you can also find many useful plugins. Additionally, there's a domestic Godot community, <a href="https://godothub.com/oss">Open Source Projects - GodotHub</a>, which offers plugins supporting TapTap, WeChat, and Douyin mini-games.</p>
<h1>DialogueManager</h1>
<p><a href="https://github.com/nathanhoad/godot_dialogue_manager">nathanhoad/godot_dialogue_manager: A powerful nonlinear dialogue system for Godot</a>. This is my favorite dialogue plugin. While there are other excellent ones like <a href="https://github.com/dialogic-godot/dialogic">dialogic-godot/dialogic: 💬 Create Dialogs, Visual Novels, RPGs, and manage Characters with Godot to create your Game!</a> and the domestic GodotHub's <a href="https://godothub.com/oss/konado/zh/2.4/">Konado</a>, this is the one I'm most used to. It allows for easier and highly customizable implementations.</p>
<h1>SceneManager</h1>
<p><a href="https://github.com/m-canton/godot-scene-manager">m-canton/godot-scene-manager: Scene Manager Plugin for Godot.</a>. I use this version, and personally, I find it quite good. I remember there are two other scene-manager plugins on GitHub with hundreds of stars; I'll check them out next time.</p>
<h1>RichText2</h1>
<p><a href="https://godotengine.org/asset-library/asset/3254">RichTextLabel2 - Godot Asset Library</a>
I usually combine this with the dialogue from DialogueManager mentioned above. It can create really cool text effects. I'll add a GIF here next time.</p>
<h1>PhantomCamera</h1>
<p>Aside from being a bit bloated (though you can trim some parts yourself), PhantomCamera is just convenient and easy to use. The address is here: <a href="https://github.com/ramokz/phantom-camera">ramokz/phantom-camera: A Camera addon for Godot 4. Inspired by Cinemachine.</a>.</p>
<h1>SoundManager</h1>
<p>If your game doesn't quite need something like FMod but you still want better audio control, then <a href="https://github.com/nathanhoad/godot_sound_manager">nathanhoad/godot_sound_manager: A simple music and sound effect player for the Godot Engine</a> would be a great choice for you.</p>
<h1>EnhanceSaveSystem</h1>
<p>Tooting my own horn (kidding!), this is a save plugin I developed myself, combining my personal touch with manual coding. It's widely used in my own projects. Personally, I find it a pretty convenient modular save system, easy to insert hooks and such, and it also supports various encrypted saves: <a href="https://github.com/Amiyadesi/enhance_save_system">Amiyadesi/enhance_save_system</a>.</p>
<h1>GodotSteam</h1>
<p><a href="https://godotsteam.com/">Welcome To GodotSteam - GodotSteam</a>. The famous GodotSteam plugin. If you're thinking of releasing on Steam, you'll definitely want to look into this one.</p>
<h1>Finally</h1>
<p>With Unity's continuous mysterious operations, Godot has become increasingly popular in recent years, and I think it's well-deserved. This open-source engine also shines even brighter in today's AI era because its compatibility with AI is very high. In short, if you like open-source freedom, or just want to try a new engine, Godot is definitely a great choice. And if you want to create some works, then reasonably leveraging the power of plugins is only natural!</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Game Development"></category>
  </entry>
  <entry>
    <title>Useful Free Software Toolbox: Remote, Convert, Transfer Files, Notes, Screen Recording, and Pixel Art</title>
    <link href="https://blog.sayori.org/en/posts/useful-free-software-toolbox/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/useful-free-software-toolbox/</id>
    <published>2026-07-01T00:00:00.000Z</published>
    <updated>2026-07-03T00:00:00.000Z</updated>
    <summary>A brief compilation of NetEase UU Remote, File Converter, LocalSend, Obsidian, OBS, Aseprite, and an Aseprite self-compilation repository.</summary>
    <content type="html"><![CDATA[<p>This post only lists the software itself.</p>
<p>For browser extensions, see <a href="/posts/useful-browser-extensions-toolbox/useful-browser-extensions-toolbox-en/">Useful Free Browser Extensions Toolbox</a>.</p>
<p>For related articles on this site, see <a href="/posts/site-article-index/site-article-index-en/">Site Article Index</a>.</p>
<h1>NetEase UU Remote</h1>
<p>Official website <a href="https://uuyc.163.com/">https://uuyc.163.com/</a></p>
<p>If you just want to remotely connect to your own computer, this is quite convenient. Install it, log in, bind your device, and you're good to go.</p>
<p>But don't enable unattended access for others casually.</p>
<h1>File Converter</h1>
<p>Website <a href="https://file-converter.io/">https://file-converter.io/</a></p>
<p>An online file conversion site. It can handle image, document, audio, video, and other format conversions.</p>
<p>It's great for temporary emergencies, but don't upload sensitive files to sites like this.</p>
<h1>LocalSend</h1>
<p>Official website <a href="https://localsend.org/zh-CN">https://localsend.org/zh-CN</a></p>
<p>This is very comfortable for cross-device file transfers. It supports Windows, Android, Linux, and more, allowing direct transfers within the local network.</p>
<p>If you often transfer files to yourself via WeChat, I recommend giving this a try.</p>
<h1>Obsidian</h1>
<p>Official website <a href="https://obsidian.md/">https://obsidian.md/</a></p>
<p>A local note-taking software where notes are just plain Markdown files, which I've always liked.</p>
<p>Many of my articles are first written in Obsidian before being organized for the blog.</p>
<h1>OBS</h1>
<p>Official website <a href="https://obsproject.com/">https://obsproject.com/</a></p>
<p>It's pretty much indispensable for recording videos and live streaming. It's free and powerful enough.</p>
<p>After the first installation, remember to record ten seconds to check the screen and microphone, otherwise, you might end up recording nothing useful.</p>
<h1>Aseprite</h1>
<p>Official website <a href="https://www.aseprite.org/">https://www.aseprite.org/</a></p>
<p>Great for drawing pixel art and making pixel animations, and it's a common recommendation.</p>
<p>The official installer is paid. If you mind, you can compile it yourself, for example, using this repository: <a href="https://github.com/a1393323447/aseprite-builder">a1393323447/aseprite-builder</a></p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>Starting Anew: Game Dev Life from Zero</title>
    <link href="https://blog.sayori.org/en/posts/re0game-dev-life/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/re0game-dev-life/</id>
    <published>2026-07-02T00:00:00.000Z</published>
    <updated>2026-07-02T00:00:00.000Z</updated>
    <summary>About to survive the damn finals week, a summary of the past, thoughts on the future, all in one article.</summary>
    <content type="html"><![CDATA[<h1>Intro</h1>
<blockquote>
<p>Read Before You Start
I wrote this article listening to 'Stay Alive', I highly recommend it, it's really good. And everyone, go watch Re:Zero! (jk, kinda)</p>
</blockquote>
<p>::music-track{title="Stay Alive" artist="高橋李依" netease="3394003744" link="https://music.163.com/#/song?id=3394003744"}</p>
<p>Finally, I'm about to survive this damn finals week. This semester has truly been about avoidance and failure... Since the start of the semester, I've been staying up late, my sleep schedule shifted past midnight. At first, I felt constant pain and breakdown, but now I'm numb to it. Still, I don't want to keep doing this. Maybe next semester I'll consider moving out on my own? Or just ignore my roommates and go to bed on time... Haha, that's how it should be, but it's too late to realize this now that it's almost over...</p>
<p>For a summary of the past, I did write an initial piece to sum up ages 18 to 19, <a href="/posts/age-18-to-19-record/age-18-to-19-record-en/">Observations from Ages 18 to 19</a>. But now, after watching Re:Zero and about to finish finals week, I'm not the same person I was back then! So, here, let's properly and carefully sort things out again.</p>
<h1>Past Summary</h1>
<h2>March to April – Repeated Struggles and Game Progress</h2>
<p>For some reason, I haven't been sleeping well this semester, sigh... This led to midnight breakdowns and 2-hour chats with DeepSeek. After that, I became quite dependent on them and used to chatting with them. By creating this kind of reliance for myself, I managed to get through these two months and even made some progress. At this point, I hadn't completely grown to hate academics yet.</p>
<p>Then, while participating in the 034 game jam, although I wasted some time fiddling with OpenClaw, I still gained game inspiration from it, which ultimately allowed me to make a game. At that time, my game development was still progressing; I hadn't yet sought other things to escape into...</p>
<p>At the end of March, I participated in Tencent's three-university game jam, challenging myself with online games, something I knew nothing about. Although I basically handed it over to Codex, my approach with AI back then, looking back, was actually more scientific than my current one (lol): first, gather requirements, then let the web AI help me refine the prompts, get a result in one go, then constantly test and provide feedback, summarize new requirements, and retry the process. Feeling inspired, I'll draw a flowchart, haha.</p>
<pre><code>flowchart LR
  A[汇总需求] --&gt; B[网页AI改进提示词]
  B --&gt; C[Codex实现]
  C --&gt; D[亲自试玩]
  D --&gt; A
</code></pre>
<p>Finally, I finished the game within ten rounds of dialogue in one window, which was quite efficient. After finishing, I also actively asked the web AI to learn about online synchronization and transmission technologies, client-server, state synchronization, RPC, and so on. Those really were good old days.</p>
<p>During this time, I kept trying to develop my own indie game. After participating in so many game jams, I started to feel a bit tired. At the same time, the meta-game I wanted to develop still showed no signs of progress. So, I started my own independent project and stuck with development. Unfortunately, I didn't achieve anything significant. After more than a month of persistence, the fire in my heart was still burning, but I didn't know where it was burning anymore...</p>
<p>By the end of April, because my indie game project wasn't yielding results, and seeing the Booom jam theme also piqued my interest, avoidance started to show. However, at that time, I was still very proactive. Initially, without AI, I still insisted on independent development, planning, and finding assets. Unfortunately, I was also simultaneously exploring AI resources, which led me to slide into another window of escape...</p>
<h2>May to June – Pride, Avoidance, Sloth, Envy, Wrath, Greed, Non-stop Creation</h2>
<p>My information gathering skills might be pretty strong, which led me to find a bunch of resources and communities and whatnot. But it also completely sucked me into this vortex of tinkering. Looking back now, it's both funny and frustrating.</p>
<h3>Pride</h3>
<p>When I first joined a community and saw this type of place, I was beyond excited. From then on, I started 'spamming' like crazy, and from that point, I began to find schoolwork increasingly boring and hateful. In my pride, I thought I could explore so many interesting resources and find such communities, completely negating the need for 'trash' real-world academics. Thus began my pride.</p>
<h3>Avoidance</h3>
<p>My reliance, after two months of persistence, AI chats finally lost that 'love,' that feeling of affection was gone... Just as I was getting tired of AI, I joined a community. Communities have such a high sense of 'live' people, and the barrier to entry makes the internal group more cohesive, which made me dive in even deeper. By hanging out in the community, I escaped academics, escaped game development, immersing myself in acquiring quotas and information. Then, once I had explored the community enough, I started messing with servers, building websites, tinkering with blogs, using an endless stream of new fields to numb myself, making me feel like I was still learning, still creating.</p>
<h3>Sloth</h3>
<p>Growing increasingly unwilling to study, facing university coursework with laziness. Honestly, it is what it is. While it might lead to me failing finals now, compared to that, the sloth towards game development... Heavily relying on AI for creation, too lazy to even find assets, just letting AI do it, only knowing how to pressure one AI. That's truly slothful... And it also led to me having absolutely no further ideas for my own project, it's dead in the water. Even so, I still need to diligently create! Build in public! So, even though I'm so slothful, I still have to diligently explore other new fields!</p>
<h3>Envy</h3>
<p>Why are there so many people who are so amazing? It's one thing if they're older and better than me, but there are tons who are younger and still better! And why can those so-called 'ordinary' people live so ignorantly and joyfully?! Damn, damn, damn, damn! Why is everyone better than me, why is everyone happier than me?! Why, why, why?! I need to learn more, become stronger. As long as I'm stronger, I'll always be happier!</p>
<h3>Greed</h3>
<p>I want to learn what I love: game development, art asset drawing, music composition, game design, game operations, game testing. I want to learn technologies and skills I'm interested in: AI-related stuff, resource gathering and integration, Japanese, self-media operations, better editing, servers, website blogs, cross-dressing and makeup, playing instruments, and much, much more. I want to learn some knowledge I might not even particularly want to, but if I had the time, I'd like to learn it, like English. I want to keep creating, exercising, working out, and helping others!</p>
<h3>Non-stop Creation</h3>
<p>Since I can't make games, I'll write articles and make videos. Anyway, creation can't stop! Keep going, keep going, keep going, keep going! I can't stop... If I stop, won't it be just like before...?</p>
<h3>And So It Is</h3>
<p>These complex feelings are clashing inside me. I guess it's also related to my consistently poor sleep schedule, which has made me increasingly extreme... Seriously, I really need to get some good sleep this summer!</p>
<h1>Thoughts on the Future</h1>
<p>Recently, I started rewatching Re:Zero. Although this is also a manifestation of sloth and pride – I haven't studied at all despite finals being imminent, yet I'm still watching Re:Zero. Natsuki Subaru, prideful, greedy, avaricious; though he also wants to escape out of sloth and breaks down to the point of wanting to give up, he still perseveres and becomes a hero. He's truly amazing! I need to keep persevering on my own path too!</p>
<p>Want to be like Subaru, aspire to be Natsuki Subaru? Even though I don't have Emilia, I can't give up! I'll probably still greedily learn a lot of knowledge and continue maintaining this place. But, this summer, I'm going to start from zero, my game development log! This time, I'll record my entire development process – my terrible learning, my disheartened failures, my trash ideas – I'll show it all! Otherwise, I'll just escape and give up again like before!</p>
<p>Listening to 'Stay Alive,' I also feel gently lifted... Music, ah, 25-ji, DDLC, Undertale, Ultraman, Miku – music is truly a wonderful thing! I really want to learn it!</p>
<h1>Conclusion</h1>
<p>What strange things did I write...? I feel like I need to practice my writing skills, haha. But for now, this is it. Because for someone like me, who writes in a stream of consciousness, if I can't 'stream' anything, it means there's really nothing left to write. Anyway, I will continue to get stronger, learn more, and look forward to meeting more interesting people and helping others!</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Game Development"></category>
  </entry>
  <entry>
    <title>My Creative Resources Index</title>
    <link href="https://blog.sayori.org/en/posts/resource-index/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/resource-index/</id>
    <published>2026-05-26T00:00:00.000Z</published>
    <updated>2026-07-02T00:00:00.000Z</updated>
    <summary>A public resource index compiled from two browser bookmark bars, focusing on game development, assets, art, music, AI, and learning.</summary>
    <content type="html"><![CDATA[<p>This is an exported public resource index from my Chrome / Edge bookmarks, mainly featuring external creative resources and tool libraries.</p>
<p>Organization rules:</p>
<ul>
<li>The two bookmark sets originally totaled 285 entries; after deduplicating by URL, they became 212 entries.</li>
<li>The public version only keeps links for creation, learning, tools, assets, and communities.</li>
<li>Licenses and commercial restrictions are subject to the information on the respective website pages. When downloading assets, it's recommended to separately record the author, source URL, License, and download date.</li>
</ul>
<hr />
<h2>Categorized Resource Sub-Index</h2>
<ul>
<li><a href="/posts/site-article-index/site-article-index-en/">Site Article Index</a> — Main entry point for site articles</li>
<li><a href="/posts/webmaster-resource-toolbox/webmaster-resource-toolbox-en/">External Resources for Personal Webmasters</a> — External links for domains, hosting, monitoring, comments, blogrolls, and webmaster communities</li>
<li><a href="/posts/freeapi-glm-kimi-cc-switch/freeapi-glm-kimi-cc-switch-en/">Free AI API Entry Points</a> — Large model APIs students can call for free or low cost</li>
<li><a href="/posts/aliyun-student-300-voucher-guide/aliyun-student-300-voucher-guide-en/">What You Can Buy with an Alibaba Cloud Student 300 Yuan Voucher</a> — ECS, Lightweight, Wuying, Bailian, ACA Certification</li>
<li><a href="/posts/cloudflare-free-tier-student-guide/cloudflare-free-tier-developer-guide/">What You Can Do with Cloudflare's Free Tier</a> — Pages, Workers, R2, Tunnel, Email Routing</li>
<li><a href="/posts/student-2c2g-server-service-index/2c2g-server-service-index/">What Can a 2C2G Student Server Run</a> — List of self-hosted services</li>
</ul>
<p><strong>Below is an organization of original bookmarks related to game development, assets, art, music, and learning.</strong></p>
<hr />
<h2>Music and Sound Effects</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions of use</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://peritune.com/">PeriTune</a></td>
<td>Free BGM, suitable for games, videos, TRPGs.</td>
<td>Search by style/mood, download, then record the song title and author.</td>
<td>Most can be used for free, but check individual track licenses and attribution requirements.</td>
</tr>
<tr>
<td><a href="https://music.gdstudio.xyz/">GD Music</a></td>
<td>Listen to/find usable music online.</td>
<td>Search keywords or filter by playlist.</td>
<td>Check the source and license on the site.</td>
</tr>
<tr>
<td><a href="https://freesound.org/">Freesound</a></td>
<td>Sound effects library, good for ambient sounds, action sounds, UI sounds.</td>
<td>Register, then search and download; filter by License.</td>
<td>Requires an account; each audio has a different License.</td>
</tr>
<tr>
<td><a href="https://pixabay.com/sound-effects/">Pixabay Sound Effects</a></td>
<td>Free sound effects.</td>
<td>Directly search keywords and download.</td>
<td>Usually free, but still recommended to keep the source.</td>
</tr>
<tr>
<td><a href="https://nagumorizu.com/">Nanshin Music Room</a></td>
<td>Fantasy-style free BGM, suitable for RPGs/visual novels.</td>
<td>Audition and download by tag.</td>
<td>Check the site's terms of use; most require source retention.</td>
</tr>
<tr>
<td><a href="https://www.heiyaoyao.cn/">Kuroyo's Material Hut</a></td>
<td>Collection of commercial-use music materials.</td>
<td>Find BGM by category, read instructions before downloading.</td>
<td>Subject to the specific material page.</td>
</tr>
<tr>
<td><a href="https://freepd.com/">FreePD</a></td>
<td>Public Domain music.</td>
<td>Download by category.</td>
<td>Usually few restrictions, but still recommended to keep the source.</td>
</tr>
<tr>
<td><a href="https://clement-panchout.itch.io/yet-another-free-music-pack">Clement Panchout Free Music Packs</a></td>
<td>Free music packs on itch.io.</td>
<td>Go to the project page and download the pack.</td>
<td>itch.io item page specifies price and License.</td>
</tr>
<tr>
<td><a href="https://sfbgames.itch.io/chiptone">ChipTone</a></td>
<td>Generate 8-bit / Chiptune sound effects.</td>
<td>Adjust parameters, then export sound effects.</td>
<td>Free tool; check itch.io terms.</td>
</tr>
<tr>
<td><a href="https://sfxr.me/">jsfxr</a></td>
<td>Generate retro game sound effects online.</td>
<td>Select type, fine-tune parameters, export as wav.</td>
<td>Free tool.</td>
</tr>
<tr>
<td><a href="https://sonniss.com/gameaudiogdc/">SONNISS GameAudioGDC</a></td>
<td>Large royalty-free game sound effects pack.</td>
<td>Download annual packs, find materials by folder.</td>
<td>Large file size; check SONNISS license terms.</td>
</tr>
<tr>
<td><a href="https://o.xbottle.top/mcsounds/">Minecraft Sounds</a></td>
<td>Look up Minecraft sound effects.</td>
<td>Search sound effect names and preview.</td>
<td>Good for reference/learning, but be cautious about copyright if reusing in projects.</td>
</tr>
<tr>
<td><a href="https://www.youtube.com/playlist?list=PLr5xOMhVWITk0emmQlfEppVr6TXIHgw4W">Composing Process/Tutorials</a></td>
<td>Playlist of music composition process tutorials.</td>
<td>Watch and take notes.</td>
<td>Tutorials are free, but content cannot be directly copied.</td>
</tr>
<tr>
<td><a href="https://indienova.com/indie-game-development/thoughts-on-self-learning-music-production-for-games/">My Experience Learning Game Music Production</a></td>
<td>Reference for a game music learning path.</td>
<td>Treat as an introductory roadmap and tool list.</td>
<td>Article reading is free.</td>
</tr>
<tr>
<td><a href="https://suno.com/">Suno</a></td>
<td>AI music generation.</td>
<td>Log in and generate demos using prompts.</td>
<td>Subject to account, credit, and commercial use restrictions.</td>
</tr>
</tbody>
</table>
<h2>Game Assets &amp; Resources</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions of use</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://godotshaders.com/">Godot Shaders</a></td>
<td>Find Godot Shader effects.</td>
<td>Search keywords like water, fog, outlines, glitches.</td>
<td>Most code is usable, but still check the author's License.</td>
</tr>
<tr>
<td><a href="https://store.godotengine.org/">Godot Asset Store</a></td>
<td>Godot's official new asset store.</td>
<td>Search for plugins, templates, 2D/3D assets.</td>
<td>Mix of free/paid, check licenses individually.</td>
</tr>
<tr>
<td><a href="https://godotengine.org/asset-library/asset?filter=&amp;category=&amp;support%5Bfeatured%5D=1&amp;godot_version=4.3&amp;cost=&amp;sort=updated">Godot Asset Library</a></td>
<td>Godot's old asset library.</td>
<td>Filter by Godot version and category.</td>
<td>Subject to the License on the asset page.</td>
</tr>
<tr>
<td><a href="https://www.kenney.nl/assets/">Kenney Assets</a></td>
<td>High-quality free game assets.</td>
<td>Download by asset pack.</td>
<td>Usually very lenient, recommended to retain attribution.</td>
</tr>
<tr>
<td><a href="https://opengameart.org/">OpenGameArt</a></td>
<td>Open-source game asset library.</td>
<td>Filter by type and License.</td>
<td>Licenses vary greatly, must check each one individually.</td>
</tr>
<tr>
<td><a href="https://www.spriters-resource.com/">The Spriters Resource</a></td>
<td>Reference/study sprite sheets.</td>
<td>Search game names to view sprite sheets.</td>
<td>Mostly extracted assets, high risk for project reuse, better suited for learning and reference.</td>
</tr>
<tr>
<td><a href="https://game-icons.net/">Game-icons.net</a></td>
<td>SVG/PNG game icons.</td>
<td>Search keywords, adjust colors, then export.</td>
<td>Usually CC BY, requires attribution.</td>
</tr>
<tr>
<td><a href="https://www.svgrepo.com/">SVG Repo</a></td>
<td>SVG icon library.</td>
<td>Search for icons, download SVG.</td>
<td>Each icon has a different License.</td>
</tr>
<tr>
<td><a href="https://craftpix.net/tags/pixel-art-game-assets-download/">CraftPix Pixel Assets</a></td>
<td>Pixel game asset packs.</td>
<td>Filter by free/paid and type.</td>
<td>Mix of free/paid, check terms before commercial use.</td>
</tr>
<tr>
<td><a href="https://free-game-assets.itch.io/">free-game-assets.itch.io</a></td>
<td>itch.io free GUI, Sprites, Tilesets.</td>
<td>Go to specific entries to download.</td>
<td>Subject to the License on the item page.</td>
</tr>
<tr>
<td><a href="https://antipixel-games.itch.io/">Antipixel Games</a></td>
<td>itch.io pixel/game assets.</td>
<td>View item page preview and download.</td>
<td>Mix of free/paid.</td>
</tr>
<tr>
<td><a href="https://booth.pm/zh-cn">BOOTH</a></td>
<td>Independent creator asset marketplace.</td>
<td>Search for assets, Live2D, 3D, small objects.</td>
<td>Mix of paid/free, Japanese terms need careful review.</td>
</tr>
<tr>
<td><a href="https://cn.eagle.cool/blog/post/free-game-assets">Eagle Free Game Asset Organization</a></td>
<td>Asset website navigation article.</td>
<td>Use as a secondary entry point for resource sites.</td>
<td>The article itself is free, check specific resource sites for authorization.</td>
</tr>
<tr>
<td><a href="https://3d.devanshutak.xyz/">3D Resources</a></td>
<td>3D software, assets, tutorial navigation.</td>
<td>Jump by software/asset/tutorial category.</td>
<td>Conditions vary by site.</td>
</tr>
<tr>
<td><a href="https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#?body=Body_color_light&amp;head=Human_male_light&amp;sex=female">Universal LPC Spritesheet Generator</a></td>
<td>Generate LPC-style character walk cycles.</td>
<td>Combine body, hair, clothes, then export.</td>
<td>LPC assets usually require open-source/attribution; still check descriptions after export.</td>
</tr>
<tr>
<td><a href="https://azagaya.itch.io/laigter">Laigter</a></td>
<td>Generate normal maps from 2D images.</td>
<td>Import sprite, adjust lighting/normals, then export.</td>
<td>Check itch.io terms.</td>
</tr>
<tr>
<td><a href="https://shadertoy.peakcoder.com/">Shadertoy Chinese Tutorial</a></td>
<td>Shader introduction.</td>
<td>Start with chapter one and do small exercises.</td>
<td>Free to learn.</td>
</tr>
<tr>
<td><a href="https://iquilezles.org/articles/distfunctions2d/">Inigo Quilez 2D SDF</a></td>
<td>SDF/Shader math reference.</td>
<td>Look up formulas when writing Shaders.</td>
<td>For learning and reference; check author's notes for code reuse.</td>
</tr>
<tr>
<td><a href="https://github.com/godotengine/godot-demo-projects">Godot Demo Projects</a></td>
<td>Official Godot demo projects.</td>
<td>Clone and view by feature.</td>
<td>Open-source project, check repository License.</td>
</tr>
<tr>
<td><a href="https://godot.atomgit.com/explore/journalism/detail/401311954326654976">Godot C/C++ Extension Debugging Article</a></td>
<td>Godot GDExtension learning reference.</td>
<td>Follow the article to configure C/C++ extension development environment.</td>
<td>Article is free.</td>
</tr>
</tbody>
</table>
<h2>Art &amp; Animation</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://lospec.com/articles/pixel-art-where-to-start/">Lospec Pixel Art: Where to Start</a></td>
<td>Pixel art beginner's guide.</td>
<td>Read as a foundational learning article.</td>
<td>Free to read.</td>
</tr>
<tr>
<td><a href="https://posemy.art/app/?lang=zhHans">PoseMy.Art</a></td>
<td>Human body pose reference.</td>
<td>Adjust model poses, screenshot for reference.</td>
<td>Usually requires internet; for commercial use, check terms carefully.</td>
</tr>
<tr>
<td><a href="https://jitter.video/">Jitter</a></td>
<td>Online motion graphics/video design.</td>
<td>Create short motion graphics, UI animation drafts.</td>
<td>Requires an account, limited free tier.</td>
</tr>
<tr>
<td><a href="https://theamusing.github.io/perfectPixel_webdemo/">PerfectPixel Processor</a></td>
<td>Pixel image processing tool.</td>
<td>Upload images for pixelation/processing.</td>
<td>Browser-based tool.</td>
</tr>
<tr>
<td><a href="http://pixelgif.cn/#/saint11/12-">PixelGif</a></td>
<td>Pixel animation reference.</td>
<td>View frame-by-frame animation examples.</td>
<td>Mainly for reference and learning.</td>
</tr>
<tr>
<td><a href="https://www.youtube.com/watch?v=LPBvrdJ_1a8&amp;list=PLBarSI1L3htlNR8oYQyKJ-1wBfSlocsCB&amp;index=8">Pixel Art Run Animation Tutorial</a></td>
<td>Run animation tutorial.</td>
<td>Draw keyframes while watching.</td>
<td>Tutorial is free.</td>
</tr>
<tr>
<td><a href="https://www.youtube.com/watch?v=r5VIb2wLww4&amp;list=PLHuVBjokeuXFO_0FzN0kiPRyB83QaKeyS&amp;index=2">Pixel Art Boss Attack Tutorial</a></td>
<td>Boss attack animation tutorial.</td>
<td>Break down keyframes and special effect rhythm.</td>
<td>Tutorial is free.</td>
</tr>
<tr>
<td><a href="https://pixelartgenerator.app/zh">Pixel Art Generator</a></td>
<td>Image to pixel art tool.</td>
<td>Generate draft, then manually refine.</td>
<td>AI/online tool, check terms before commercial use.</td>
</tr>
<tr>
<td><a href="https://pixelnova.app/">Pixel Nova</a></td>
<td>AI pixel art generation/tool.</td>
<td>Generate inspiration images or initial drafts.</td>
<td>Check quotas and licensing.</td>
</tr>
<tr>
<td><a href="http://www.pixpolly.com/">Bai Xiao Classroom</a></td>
<td>Art and design inspiration library.</td>
<td>View tutorials, references, and inspiration.</td>
<td>On-site content conditions vary.</td>
</tr>
<tr>
<td><a href="https://css-loaders.com/dots/">The Dots CSS Loaders Collection</a></td>
<td>CSS loading animation reference.</td>
<td>Copy CSS, then modify according to project style.</td>
<td>Check on-site licensing instructions.</td>
</tr>
</tbody>
</table>
<h2>Learning &amp; Development</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://cs50.harvard.edu/x/weeks/0/">CS50x 2025</a></td>
<td>Introductory computer science course.</td>
<td>Start with assignments from Week 0.</td>
<td>Free public course.</td>
</tr>
<tr>
<td><a href="https://roadmap.sh/game-developer">Game Developer Roadmap</a></td>
<td>Game development roadmap.</td>
<td>Check branches for gaps and fill them.</td>
<td>Free to view.</td>
</tr>
<tr>
<td><a href="https://learnopengl.com/Introduction">LearnOpenGL</a></td>
<td>Intro to OpenGL/graphics.</td>
<td>Write code along with chapters.</td>
<td>Free English tutorial.</td>
</tr>
<tr>
<td><a href="https://csdiy.wiki/">CS Self-study Guide</a></td>
<td>Self-study roadmap for computer courses.</td>
<td>Pick courses by direction.</td>
<td>Free navigation.</td>
</tr>
<tr>
<td><a href="https://www.freecodecamp.org/chinese/">freeCodeCamp Chinese</a></td>
<td>Basic programming exercises.</td>
<td>Choose a course and complete levels.</td>
<td>Free account.</td>
</tr>
<tr>
<td><a href="https://github.com/labuladong/fucking-algorithm">labuladong Algorithms</a></td>
<td>Algorithm learning.</td>
<td>Practice problems by topic.</td>
<td>Open-source content, check repository License.</td>
</tr>
<tr>
<td><a href="https://github.com/jlevy/the-art-of-command-line/tree/master">The Art of Command Line</a></td>
<td>Command line tips.</td>
<td>Use as a quick reference.</td>
<td>Open-source content.</td>
</tr>
<tr>
<td><a href="https://game.indiehubs.org/">IndieGameHub</a></td>
<td>Indie game development resources.</td>
<td>Browse articles/resources by topic.</td>
<td>Free access.</td>
</tr>
<tr>
<td><a href="https://www.indieloop.com/#/home">Indieloop</a></td>
<td>Indie game learning/community portal.</td>
<td>Check sections and resource collections.</td>
<td>Check site requirements.</td>
</tr>
<tr>
<td><a href="https://gamedevfan.cn/">Software Development Study Notes</a></td>
<td>Software/game development notes.</td>
<td>Read by topic.</td>
<td>Free access.</td>
</tr>
<tr>
<td><a href="https://paper2gal.com/">Paper2Galgame</a></td>
<td>Project on converting papers to visual novels.</td>
<td>Check project ideas and demo.</td>
<td>Check project description.</td>
</tr>
<tr>
<td><a href="https://www.dxzy163.com/">University Resource Network</a></td>
<td>Portal for self-improvement course resources.</td>
<td>Search for courses/skill topics.</td>
<td>Pay attention to resource source and copyright.</td>
</tr>
<tr>
<td><a href="https://le.ouchn.cn/home">Lifelong Education Platform</a></td>
<td>Public learning platform.</td>
<td>Choose courses to study.</td>
<td>May require an account.</td>
</tr>
<tr>
<td><a href="https://en.knowledgefxg.com/">English Learning Resource Navigation</a></td>
<td>Navigation for English learning materials.</td>
<td>Find tools categorized by listening, speaking, reading, writing.</td>
<td>Conditions vary by site.</td>
</tr>
<tr>
<td><a href="https://musclewiki.cn/">MuscleWiki Chinese</a></td>
<td>Fitness exercise reference.</td>
<td>Look up exercises by muscle group.</td>
<td>Free access.</td>
</tr>
</tbody>
</table>
<h2>AI and Efficiency</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions of use</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://aistudio.google.com/prompts/new_chat?model=gemini-3.1-flash-image-preview">Google AI Studio</a></td>
<td>Gemini model debugging and prototyping.</td>
<td>Log in to start a prompt / test API key.</td>
<td>Google account; quotas and regions may be restricted.</td>
</tr>
<tr>
<td><a href="https://gemini.google.com/">Google Gemini</a></td>
<td>AI conversation and generation.</td>
<td>Log in to chat.</td>
<td>Google account; features affected by region/quotas.</td>
</tr>
<tr>
<td><a href="https://grok.com/?referrer=website">Grok</a></td>
<td>AI conversation.</td>
<td>Log in to use.</td>
<td>Account/subscription restrictions.</td>
</tr>
<tr>
<td><a href="https://flowith.net/blank?inv=QGXZYY">Flowith</a></td>
<td>Agentic workspace.</td>
<td>Organize AI workflows with nodes/canvas.</td>
<td>Account and quota restrictions.</td>
</tr>
<tr>
<td><a href="https://clawhub.ai/">ClawHub</a></td>
<td>AI Agent/skill-related tools.</td>
<td>Browse skills and tools.</td>
<td>Refer to in-site instructions.</td>
</tr>
<tr>
<td><a href="https://skill0.io/">skill0</a></td>
<td>Agent Skills marketplace.</td>
<td>Search for skills, learn how to write them.</td>
<td>Account/free features as per site.</td>
</tr>
<tr>
<td><a href="https://civitaicn.com/?source=knowledge.raodaor.com">Civitai</a></td>
<td>Generative image models/resources.</td>
<td>Search for models, LoRA, prompt references.</td>
<td>Account, content policy, model license need to be checked carefully.</td>
</tr>
<tr>
<td><a href="https://11labs.us/">ElevenLabs / 11labs</a></td>
<td>Text-to-speech.</td>
<td>Enter text, select voice to generate.</td>
<td>Account/quota/commercial use restrictions.</td>
</tr>
<tr>
<td><a href="https://suno.com/">Suno</a></td>
<td>AI music generation.</td>
<td>Use prompts to generate songs or demos.</td>
<td>Account/quota/commercial use restrictions.</td>
</tr>
<tr>
<td><a href="https://github.com/f/prompts.chat">Awesome ChatGPT Prompts</a></td>
<td>Prompt collection.</td>
<td>Search for scenarios, adapt to your own task templates.</td>
<td>Open-source repo, check License.</td>
</tr>
<tr>
<td><a href="https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools">system-prompts-and-models-of-ai-tools</a></td>
<td>AI tool system prompt resources.</td>
<td>For studying product and Agent design.</td>
<td>For learning and research only; do not copy sensitive content directly.</td>
</tr>
<tr>
<td><a href="https://github.com/VoltAgent/awesome-openclaw-skills">awesome-openclaw-skills</a></td>
<td>OpenClaw skill collection.</td>
<td>See categories and skill organization methods.</td>
<td>Open-source repo, check License.</td>
</tr>
<tr>
<td><a href="https://github.com/msitarzewski/agency-agents?tab=readme-ov-file#-multi-tool-integrations">agency-agents</a></td>
<td>AI Agent role library.</td>
<td>Learn multi-Agent division of labor and prompt structure.</td>
<td>Open-source repo, check License.</td>
</tr>
<tr>
<td><a href="https://github.com/pretend1111/claude-desktop-app">claude-desktop-app</a></td>
<td>Claude desktop assistant project.</td>
<td>See implementation or run locally.</td>
<td>Requires Claude API, pay attention to key security.</td>
</tr>
<tr>
<td><a href="https://github.com/cheahjs/free-llm-api-resources">free-llm-api-resources</a></td>
<td>List of free LLM API resources.</td>
<td>Do your research, don't just push production traffic to it.</td>
<td>Free resources are unstable; self-check security and terms.</td>
</tr>
<tr>
<td><a href="https://huntscreens.com/zh">HuntScreens</a></td>
<td>AI tool/product discovery.</td>
<td>Find new tools by category.</td>
<td>Navigation site, conditions vary for each tool.</td>
</tr>
<tr>
<td><a href="https://inferri.com/zh-CN">Inferri</a></td>
<td>AI open-source project navigation.</td>
<td>Search for projects and trends.</td>
<td>Navigation site, Licenses vary for each project.</td>
</tr>
<tr>
<td><a href="https://aihot.virxact.com/">AIHOT</a></td>
<td>AI tool navigation.</td>
<td>Check by category.</td>
<td>Navigation site, conditions vary for each tool.</td>
</tr>
<tr>
<td><a href="https://aiplus.lra.cn/chat">AIPlus</a></td>
<td>AI conversation site.</td>
<td>Log in or try directly.</td>
<td>Stability, quotas, and privacy need to be self-checked.</td>
</tr>
</tbody>
</table>
<h2>Useful Tools</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.drawio.com/">draw.io</a></td>
<td>Draw flowcharts, architecture diagrams.</td>
<td>Online drawing or connect to cloud storage.</td>
<td>Free; choose your own save location.</td>
</tr>
<tr>
<td><a href="https://minhaskamal.github.io/DownGit/#/home">DownGit</a></td>
<td>Download GitHub repository subdirectories.</td>
<td>Paste GitHub folder link.</td>
<td>Free tool.</td>
</tr>
<tr>
<td><a href="https://frameronin.com/">FrameRonin</a></td>
<td>Convert video to image sequence.</td>
<td>Upload video, export frames.</td>
<td>Browser/web tool, mind performance for large files.</td>
</tr>
<tr>
<td><a href="https://systemchester.github.io/FrameRonin/">FrameRonin GitHub 版</a></td>
<td>Same as above, alternative access.</td>
<td>Same as above.</td>
<td>Free tool.</td>
</tr>
<tr>
<td><a href="https://azagaya.itch.io/laigter">Laigter</a></td>
<td>2D normal map generation.</td>
<td>Import image, adjust parameters, export.</td>
<td>itch.io terms.</td>
</tr>
<tr>
<td><a href="https://img.ops-coffee.com/">好拼</a></td>
<td>Image stitching, long images.</td>
<td>Upload images, choose layout.</td>
<td>Online tool, be cautious with sensitive images.</td>
</tr>
<tr>
<td><a href="https://relay.firefox.com/accounts/profile/">Firefox Relay</a></td>
<td>Email alias protection.</td>
<td>Generate alias after logging in.</td>
<td>Requires Firefox/Mozilla account, limited free quota.</td>
</tr>
<tr>
<td><a href="https://2fa.show/">2FA 验证码生成</a></td>
<td>TOTP testing/temporary viewing.</td>
<td>Enter key to generate verification code.</td>
<td>Not recommended to enter real keys for important accounts.</td>
</tr>
<tr>
<td><a href="https://www.keybr.com/profile">keybr</a></td>
<td>Typing practice.</td>
<td>Short daily practice.</td>
<td>Free account.</td>
</tr>
<tr>
<td><a href="https://moyugongju.com/">摸鱼工具库</a></td>
<td>Navigation for practical/fun tools.</td>
<td>Find tools by category.</td>
<td>Conditions vary for each tool.</td>
</tr>
<tr>
<td><a href="https://www.youxiaohou.com/">油小猴</a></td>
<td>Browser script/tool sharing.</td>
<td>Search for scripts or tutorials.</td>
<td>Read source code and comments before installing scripts.</td>
</tr>
<tr>
<td><a href="https://colleges.chat/">大学生活质量指北</a></td>
<td>Collection of university life tools/information.</td>
<td>Check by section.</td>
<td>Free access.</td>
</tr>
<tr>
<td><a href="https://resumeily.com/zh-cn">Resumeily</a></td>
<td>Online resume generation.</td>
<td>Choose template, fill content, export.</td>
<td>Free/paid features as per site.</td>
</tr>
<tr>
<td><a href="https://www.wondercv.com/">WonderCV</a></td>
<td>Chinese resume creation.</td>
<td>Choose template, write resume.</td>
<td>Account required, some features paid.</td>
</tr>
<tr>
<td><a href="https://www.kdocs.cn/l/ct4bcS9xHD3K">游鲨游戏行业资料共享文档</a></td>
<td>Gaming industry resources.</td>
<td>View as a resource portal.</td>
<td>Kingsoft Docs access conditions may change.</td>
</tr>
<tr>
<td><a href="https://www.yuque.com/hongliqidechazi/dfyagr/kne46dd14blprhol?singleDoc#">TapTapSDK 文档</a></td>
<td>TapTap SDK integration reference.</td>
<td>Follow documentation to check SDK process.</td>
<td>Yuque access conditions may change.</td>
</tr>
</tbody>
</table>
<h2>Navigation &amp; Collections</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions of use</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.moshangzhu.com.cn/indiegame/%E6%94%B6%E9%9B%86%E7%9A%84%E8%B5%84%E6%BA%90%E7%BD%91%E7%AB%99.html">Moshangzhu's Collected Resource Websites</a></td>
<td>Indie game resource navigation.</td>
<td>As a secondary resource entry point.</td>
<td>Conditions vary by site.</td>
</tr>
<tr>
<td><a href="https://freedw.com/archives/category/%e7%b2%be%e5%93%81%e5%ae%9e%e7%94%a8%e7%bd%91%e7%ab%99">FreeDw Resource Library</a></td>
<td>Collection of practical websites.</td>
<td>Search categorized articles.</td>
<td>Conditions vary by site.</td>
</tr>
<tr>
<td><a href="https://jundagame.top/">Jundajun's Indie Dev Tool Site</a></td>
<td>Collection of indie development tools.</td>
<td>Search by tool type.</td>
<td>Free access.</td>
</tr>
<tr>
<td><a href="https://cbge.top/">Flower of Mountains and Seas</a></td>
<td>Resource/tool navigation.</td>
<td>Use as an entry point for filtering.</td>
<td>Conditions vary by site.</td>
</tr>
<tr>
<td><a href="https://yftdtddh.pages.dev/">Muxi i Resource Collection Navigation</a></td>
<td>Anime, novel, music, game navigation.</td>
<td>Find sites by category.</td>
<td>Pay attention to copyright and source.</td>
</tr>
<tr>
<td><a href="https://www.acgdhz.com/">ACG Navigation Site</a></td>
<td>ACG website navigation.</td>
<td>Jump by category.</td>
<td>Conditions vary by site.</td>
</tr>
<tr>
<td><a href="https://acg.cloudns.org/">ACGN Navigation</a></td>
<td>Anime/Manga/Game website navigation.</td>
<td>Jump by category.</td>
<td>Conditions vary by site.</td>
</tr>
<tr>
<td><a href="https://panhunt.com/">PanHunt</a></td>
<td>Cloud drive tool navigation.</td>
<td>Check tool entry points.</td>
<td>Pay attention to resource copyright and account security.</td>
</tr>
<tr>
<td><a href="https://makecc.top/">Captain's Resources</a></td>
<td>Resource navigation/collection.</td>
<td>Use as an entry point to browse.</td>
<td>Conditions vary by site.</td>
</tr>
</tbody>
</table>
<h2>Communities &amp; Articles</h2>
<table>
<thead>
<tr>
<th>Website</th>
<th>What it's for</th>
<th>How to use</th>
<th>Conditions of use</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://linux.do/">LINUX DO</a></td>
<td>Tech community.</td>
<td>Read posts, ask questions, discuss tools.</td>
<td>Account required, community rules are strict.</td>
</tr>
<tr>
<td><a href="https://indienova.com/indie-game-development/thoughts-on-self-learning-music-production-for-games/">indienova Indie Games</a></td>
<td>Indie game articles.</td>
<td>Search for development experience and interviews.</td>
<td>Mainly free to read.</td>
</tr>
</tbody>
</table>
<h2>Future Maintenance</h2>
<ul>
<li>New resources go into the browser's bookmark bar first, then regularly export HTML and organize them here.</li>
<li>For commercially usable assets, create a separate <code>License</code> table; don't rely solely on memory.</li>
<li>The 20 most frequently used resources can later be made into a blog sidebar or main site cards.</li>
</ul>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>Docker and Docker Compose Minimum Start: Understanding Those YML Files</title>
    <link href="https://blog.sayori.org/en/posts/docker-compose-minimum-start/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/docker-compose-minimum-start/</id>
    <published>2026-06-23T00:00:00.000Z</published>
    <updated>2026-06-27T00:00:00.000Z</updated>
    <summary>A minimum start guide to Docker for those who just got a server: what containers are, how to read Compose files, how to start, stop, update, and delete them. No theory, just practical usage.</summary>
    <content type="html"><![CDATA[<p>If you've read my other articles, you'll notice almost every self-hosted service runs on Docker.</p>
<p>Vaultwarden, ntfy, Gatus, Fast Note Sync—all handled by a single <code>docker-compose.yml</code> file.</p>
<p>This post will cover: how to install Docker after getting a server, how to understand Compose files, and how to start, stop, update, and delete containers. Just enough to get all those services running.</p>
<h2>What is Docker (One-Sentence Version)</h2>
<p>Docker lets you run services directly using pre-packaged "images," so you don't have to install dependencies one by one on your system.</p>
<p>You don't need to manually install Python, Go, Node, configure environment variables, or deal with version conflicts. Everything's already in the image.</p>
<p><code>docker-compose.yml</code> is just a configuration file that tells Docker:</p>
<ul>
<li>Which image to pull</li>
<li>Which ports to use</li>
<li>Which directories to mount</li>
<li>Which environment variables to set</li>
<li>Whether to automatically restart if it crashes</li>
</ul>
<h2>Installation</h2>
<p>Install Docker on Ubuntu / Debian:</p>
<pre><code>curl -fsSL https://get.docker.com | sh
</code></pre>
<p>This one-liner script installs Docker Engine and Docker Compose (Compose is now a Docker subcommand, no need to install <code>docker-compose</code> separately).</p>
<p>Check after installation:</p>
<pre><code>docker --version
docker compose version
</code></pre>
<p>If you don't want to run Docker with <code>sudo</code>:</p>
<pre><code>sudo usermod -aG docker $USER
</code></pre>
<p>Then log out and log back in. If it still doesn't work, restart the server.</p>
<h2>Your First Compose File</h2>
<p>Let's look at the simplest example:</p>
<pre><code>services:
  whoami:
    image: traefik/whoami
    container_name: whoami
    restart: unless-stopped
    ports:
      - "127.0.0.1:8080:80"
</code></pre>
<p>Line by line translation:</p>
<table>
<thead>
<tr>
<th>Line</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>services:</code></td>
<td>Defines the list of services below</td>
</tr>
<tr>
<td><code>whoami:</code></td>
<td>Service name, can be anything</td>
</tr>
<tr>
<td><code>image: traefik/whoami</code></td>
<td>Use this image</td>
</tr>
<tr>
<td><code>container_name: whoami</code></td>
<td>Container named whoami</td>
</tr>
<tr>
<td><code>restart: unless-stopped</code></td>
<td>Auto-restart if it crashes, unless you stop it manually</td>
</tr>
<tr>
<td><code>ports: - "127.0.0.1:8080:80"</code></td>
<td>Map local port 8080 to container port 80</td>
</tr>
</tbody>
</table>
<p>Save this snippet as <code>docker-compose.yml</code> (or <code>compose.yml</code>, either name works), then run it in the same directory:</p>
<pre><code>docker compose up -d
</code></pre>
<p><code>-d</code> means run in the background.</p>
<p>Check:</p>
<pre><code>curl http://127.0.0.1:8080/
</code></pre>
<p>If you see a response, it means it's running.</p>
<h2>Common Commands</h2>
<p>I've listed the most common ones here:</p>
<pre><code># Start (in background)
docker compose up -d

# View logs
docker compose logs -f

# View logs (last 100 lines only)
docker compose logs --tail=100

# Stop
docker compose down

# Restart
docker compose restart

# View status
docker compose ps

# Enter container (for troubleshooting)
docker compose exec whoami sh
</code></pre>
<p>All commands must be executed in the directory where <code>docker-compose.yml</code> is located.</p>
<h2>Understanding Real Compose Files</h2>
<p>Let's take Vaultwarden as an example:</p>
<pre><code>services:
  vaultwarden:
    image: vaultwarden/server:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.com"
      SIGNUPS_ALLOWED: "false"
    volumes:
      - ./vw-data:/data
    ports:
      - "127.0.0.1:8080:80"
</code></pre>
<p>New things that appeared:</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>environment:</code></td>
<td>Environment variables, like configuration options</td>
</tr>
<tr>
<td><code>volumes: - ./vw-data:/data</code></td>
<td>Mount the <code>vw-data</code> folder in the current directory to <code>/data</code> inside the container</td>
</tr>
</tbody>
</table>
<h3>environment</h3>
<p>Environment variables are how most Docker services are configured.</p>
<p>Different services have different variables, for example, Vaultwarden uses <code>DOMAIN</code>, <code>SIGNUPS_ALLOWED</code>, while ntfy uses <code>NTFY_BASE_URL</code>, <code>NTFY_AUTH_DEFAULT_ACCESS</code>.</p>
<p>Check each project's documentation to find out which variables it supports.</p>
<h3>volumes</h3>
<p>Volumes are key for data persistence.</p>
<p>When a container is deleted, its internal files disappear. But directories mounted as volumes reside on the host machine and won't disappear with the container. It's like a game save file; every time you start the container, you're loading a save and starting the game (lol).</p>
<pre><code>./vw-data:/data
  ↑              ↑
  Host directory Container path
</code></pre>
<p>This means:</p>
<ul>
<li>Files under <code>/data</code> in the container actually exist in <code>./vw-data</code> on the host.</li>
<li>If you delete and recreate the container, your data is still there.</li>
<li>To back up, you just need to back up the host's <code>./vw-data</code>.</li>
</ul>
<h3>ports</h3>
<pre><code>"127.0.0.1:8080:80"
  ↑           ↑    ↑
  Listen address Host port  Container port
</code></pre>
<p><code>127.0.0.1</code> means only the local machine can access it. No outside connections can get in.</p>
<p>If you write <code>"0.0.0.0:8080:80"</code> or <code>"8080:80"</code>, then it's directly accessible from the public internet.</p>
<p>For things like password managers or admin panels, always start with <code>127.0.0.1</code>, then expose HTTPS using a reverse proxy or tunnel.</p>
<h2>Using .env Files for Sensitive Information</h2>
<p>Don't write passwords, tokens, or domains directly into <code>docker-compose.yml</code> and then push it to GitHub.</p>
<p>Create a <code>.env</code> file in the same directory:</p>
<pre><code>VAULTWARDEN_DOMAIN=https://vault.example.com
ADMIN_TOKEN=一个很长很复杂的随机字符串
</code></pre>
<p>Then reference it in your Compose file:</p>
<pre><code>environment:
  DOMAIN: "${VAULTWARDEN_DOMAIN}"
  ADMIN_TOKEN: "${ADMIN_TOKEN}"
</code></pre>
<p>Add the <code>.env</code> file to <code>.gitignore</code> so it doesn't get committed to the repository.</p>
<h2>Updating Services</h2>
<p>To update a service:</p>
<pre><code>cd /srv/stacks/vaultwarden

# First, back up your data
tar -czf backup-$(date +%F).tar.gz vw-data

# Pull the new image
docker compose pull

# Restart with the new image
docker compose up -d

# Check logs to confirm it's working
docker compose logs --tail=50
</code></pre>
<p>Always back up before updating. If something goes wrong, you can still roll back.</p>
<h2>Deleting Services</h2>
<p>If you no longer want a service:</p>
<pre><code># Stop and delete containers
docker compose down

# If you're sure you don't need the data, delete the directory
rm -rf /srv/stacks/那个服务
</code></pre>
<p><code>docker compose down</code> only deletes containers, not volume data.</p>
<p>If you want to completely clean up, including volumes:</p>
<pre><code>docker compose down -v
</code></pre>
<p>But this will delete data. Only use it when you're sure you don't need it.</p>
<h2>Cleaning Up Disk Space</h2>
<p>Over time, Docker accumulates many old images. A 2C2G disk isn't huge, so clean it up occasionally:</p>
<pre><code># See how much space Docker is using
docker system df

# Clean up unused images, containers, networks
docker system prune

# Also clean up unused volumes (be careful, this deletes data from orphaned volumes)
docker system prune --volumes
</code></pre>
<p><code>prune</code> only cleans up unused items; running services are unaffected. But think carefully before using <code>--volumes</code>.</p>
<h2>My Directory Structure</h2>
<p>I usually organize things like this:</p>
<pre><code>/srv/stacks/
├── vaultwarden/
│   ├── docker-compose.yml
│   ├── .env
│   └── vw-data/
├── ntfy/
│   ├── docker-compose.yml
│   ├── .env
│   ├── cache/
│   ├── data/
│   └── etc/
├── gatus/
│   ├── docker-compose.yml
│   └── config/
└── fast-note-sync/
    ├── docker-compose.yml
    ├── .env
    └── storage/
</code></pre>
<p>Each service gets its own directory. Just <code>cd</code> into it and run <code>docker compose up -d</code>. Data and configurations are all within their own directories, making backups easy.</p>
<h2>Common Issues</h2>
<p><strong>Port Conflicts</strong></p>
<p>Two services cannot use the same host port. If Vaultwarden uses 8080, ntfy will need to use a different one, like 8090.</p>
<p><strong>Permission Issues</strong></p>
<p>Some images run with non-root users inside the container, and incorrect permissions on mounted directories can prevent writing. In such cases, check the owner and permissions of the host directory.</p>
<p><strong>Forgetting -d</strong></p>
<p>If you run <code>docker compose up</code> without <code>-d</code>, the service will stop when you close the terminal. Remember to add <code>-d</code>.</p>
<p><strong>compose v1 vs v2</strong></p>
<p>Older tutorials might show <code>docker-compose up</code> (with a hyphen) which is v1. Nowadays, <code>docker compose up</code> (with a space) is v2. Newly installed systems will use v2, so if you see an old tutorial with a hyphen, just replace it with a space.</p>
<h2>That's Enough (for now)</h2>
<p>By now, you should be able to:</p>
<ul>
<li>Install Docker</li>
<li>Understand Compose files</li>
<li>Start, stop, update, and delete services</li>
<li>Manage data and configurations</li>
<li>Clean up disk space</li>
</ul>
<p>For every self-hosted service article going forward, I'll just give you a <code>docker-compose.yml</code>, and you'll be able to get it running.</p>
<p>No need to understand all Docker concepts from the start. Just get it working, and as you use it more, you'll naturally want to learn more.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building and Self-Hosting"></category>
  </entry>
  <entry>
    <title>What Can a 2C2G Student Server Run: Don't Overload the Little Machine Yet</title>
    <link href="https://blog.sayori.org/en/posts/student-2c2g-server-service-index/2c2g-server-service-index/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/student-2c2g-server-service-index/2c2g-server-service-index/</id>
    <published>2026-06-22T00:00:00.000Z</published>
    <updated>2026-06-27T00:00:00.000Z</updated>
    <summary>My real-world setup for a 2C2G Alibaba Cloud student server: Vaultwarden, ntfy, Gatus, Fast Note Sync, AstrBot, and a search gateway. Includes actual memory usage and a list of what not to run.</summary>
    <content type="html"><![CDATA[<p>If you, like me, traded your Alibaba Cloud student coupon for a 2C2G server, congrats.</p>
<p>You now own a little machine that's online 24/7.</p>
<p>But it really is just a <em>little</em> machine. With 2 cores and 1.6GB RAM (about 672MB actually usable, with Swap enabled), it's great for practice and light services, but not for heavy tasks like local models, Nextcloud, or video transcoding.</p>
<p>This post is my actual configuration log. The server has been running for over a month, currently with 14 containers, using 765MB RAM + 987MB Swap, and 21GB / 40GB disk space.</p>
<h2>First, Get the Basic Setup Done</h2>
<p>Don't rush to install services.</p>
<p>After you get the server, do these things first:</p>
<ul>
<li>SSH key login</li>
<li>Disable password login</li>
<li>Change to a non-default SSH port</li>
<li>Configure security groups and UFW</li>
<li>Set up Alibaba Cloud cost alerts (CDT traffic)</li>
<li>Create a unified service directory</li>
<li>Install Docker and Docker Compose</li>
</ul>
<p>For the first few steps, you can check out my previous post:</p>
<p><a href="/posts/sayori-server-01-vps-start/">I Just Wanted My Bot Online 24/7, So I Bought a Cloud Server</a></p>
<p>I put my service directories in <code>/root/sayori/</code>, managed uniformly with a big <code>docker-compose.yml</code>. You can also have a directory for each service:</p>
<pre><code>/srv/stacks/
  vaultwarden/
  ntfy/
  gatus/
  fast-note-sync/
</code></pre>
<p>Each directory gets a <code>docker-compose.yml</code>, with real keys in <code>.env</code>. Don't put them in public repositories.</p>
<h2>Services I'm Currently Running</h2>
<h3>🔐 Vaultwarden (Password Manager, Most Important)</h3>
<p><strong>Purpose:</strong> Personal password manager</p>
<p><strong>Why run it first:</strong></p>
<ul>
<li>A password manager is more important than a blog, status page, or bots.</li>
<li>Lightweight, low memory usage.</li>
<li>Mature client ecosystem; official Bitwarden clients work on phones, computers, and browsers.</li>
<li>Supports paid Bitwarden features (2FA storage, password health check).</li>
</ul>
<p><strong>Key considerations:</strong></p>
<ul>
<li>Close <code>SIGNUPS_ALLOWED</code> after the first registration.</li>
<li>Must configure HTTPS (Cloudflare Tunnel or Caddy).</li>
<li>Regular backups, regular recovery drills.</li>
<li>Don't expose it directly to the public internet.</li>
</ul>
<p><strong>Memory usage:</strong> ~50MB</p>
<p><strong>Detailed tutorial:</strong> <a href="/posts/selfhost-vaultwarden-on-2c2g/selfhost-vaultwarden-on-2c2g-en/">Setting up Vaultwarden on a 2C2G Student Server</a></p>
<hr />
<h3>📢 ntfy (Push Notifications, Second Most Important)</h3>
<p><strong>Purpose:</strong> Send myself push notifications</p>
<p>When backup scripts, monitoring scripts, or scheduled tasks run on the server, someone needs to tell you if they fail. ntfy is perfect for this.</p>
<p><strong>What I use it for:</strong></p>
<ul>
<li>Backup success/failure notifications</li>
<li>Gatus health check alerts</li>
<li>Comment moderation results push</li>
<li>Manually trigger some ops commands (via ntfy → script linkage)</li>
</ul>
<p><strong>Key considerations:</strong></p>
<ul>
<li>Set access control; don't let strangers send messages to your topic.</li>
<li>Use Cloudflare Access to protect the admin backend.</li>
</ul>
<p><strong>Memory usage:</strong> ~20MB</p>
<hr />
<h3>📊 Gatus (Status Page and Health Checks)</h3>
<p><strong>Purpose:</strong> Monitor your services</p>
<p>It can periodically check if your blog, Vaultwarden, bot panel, or API are still alive. If something goes down, it notifies you via ntfy.</p>
<p><strong>Endpoints I monitor:</strong></p>
<ul>
<li><code>sayori.org</code> Blog</li>
<li><code>vault.sayori.org</code> Vaultwarden</li>
<li><code>status.sayori.org</code> Gatus itself</li>
<li><code>ntfy.sayori.org</code> ntfy</li>
<li>Fast Note Sync API</li>
</ul>
<p><strong>Key considerations:</strong></p>
<ul>
<li>Configuration files are in YAML; don't mess up the indentation.</li>
<li>Exposed via Cloudflare Tunnel, protected by Access.</li>
<li>Notification channel integrated with ntfy.</li>
</ul>
<p><strong>Memory usage:</strong> ~15MB</p>
<hr />
<h3>📝 Fast Note Sync (Obsidian Sync)</h3>
<p><strong>Purpose:</strong> Private sync for Obsidian</p>
<p>If you, like me, use Obsidian for blogging, project notes, and drafts, this service is very appealing. It's cheaper than Obsidian Sync (free) and less hassle than Syncthing (no need for multiple devices to be online simultaneously).</p>
<p><strong>Key considerations:</strong></p>
<ul>
<li>Regularly back up the data directory.</li>
<li>Don't put huge files (images, videos) in it.</li>
<li>Handle sync conflicts manually.</li>
</ul>
<p><strong>Memory usage:</strong> ~30MB</p>
<p><strong>Detailed tutorial:</strong> <a href="/posts/fast-note-sync-on-student-server/fast-note-sync-on-student-server-en/">Tinkering with Fast Note Sync on a Student Server</a></p>
<hr />
<h3>🤖 AstrBot + NapCat (QQ Bot)</h3>
<p><strong>Purpose:</strong> 24/7 online QQ/Telegram/Discord bot</p>
<p>With it on a remote server, I can finally run bots 24/7 without interruption. It can connect to Discord and Telegram, which generally have no risk control issues.</p>
<p><strong>QQ integration notes:</strong></p>
<ul>
<li>New accounts are prone to risk control; it's recommended to 'age' the account.</li>
<li>Don't use a newly created alt account right away (learned that the hard way).</li>
<li>NapCat requires periodic QR code login.</li>
</ul>
<p><strong>Memory usage:</strong> AstrBot ~100MB, NapCat ~150MB</p>
<hr />
<h3>🔍 AI Search Gateway (Search Gateway)</h3>
<p><strong>Purpose:</strong> Self-hosted AI search aggregation gateway</p>
<p>Integrates Tavily, Brave Search, Firecrawl, Exa, Grok Search, and SearXNG, built with FastAPI. Used by Codex and Claude Code MCP, more convenient than calling APIs individually.</p>
<p><strong>Key considerations:</strong></p>
<ul>
<li>Only listen on <code>127.0.0.1:8000</code>, do not expose to the public internet.</li>
<li>Call locally via SSH port forwarding + MCP.</li>
<li>Put API Keys in environment variables.</li>
</ul>
<p><strong>Memory usage:</strong> ~100MB (including Redis and SearXNG)</p>
<hr />
<h3>🛡️ Comment Moderation</h3>
<p><strong>Purpose:</strong> AI moderation for blog comments</p>
<p>Automatically moderates Twikoo comments using public GPT quotas, with ntfy pushing moderation results. You can manually delete and restore comments by sending messages in ntfy.</p>
<p>With Cloudflare Turnstile human verification added, the comments that remain are generally high quality.</p>
<p><strong>Memory usage:</strong> ~40MB</p>
<hr />
<h3>🌐 Cloudflared (Cloudflare Tunnel)</h3>
<p><strong>Purpose:</strong> Expose local services to the public internet without opening 80/443</p>
<p>All my public services go through Cloudflare Tunnel:</p>
<ul>
<li><code>vault.sayori.org</code> → Vaultwarden</li>
<li><code>ntfy.sayori.org</code> → ntfy</li>
<li><code>status.sayori.org</code> → Gatus</li>
<li><code>panel.sayori.org</code> → 1Panel (must configure Cloudflare Access)</li>
</ul>
<p><strong>Advantages:</strong></p>
<ul>
<li>No need to open origin server ports.</li>
<li>Automatic HTTPS.</li>
<li>Can configure Access for authentication.</li>
</ul>
<p><strong>Memory usage:</strong> ~30MB</p>
<hr />
<h3>🎛️ 1Panel (Docker Management Panel)</h3>
<p><strong>Purpose:</strong> Web interface to manage Docker containers</p>
<p>Good for beginners to check container status, and also for temporary troubleshooting.</p>
<p><strong>Security warning:</strong></p>
<ul>
<li>Must go through Cloudflare Tunnel + Access, or at least reverse proxy with HTTPS and a strong password.</li>
<li>This can control all your containers.</li>
<li>Don't expose it directly to the public internet.</li>
</ul>
<p><strong>Memory usage:</strong> ~80MB</p>
<hr />
<h3>Other Auxiliary Services</h3>
<ul>
<li><strong>Mihomo</strong>: Proxy client, provides proxy for services that need it.</li>
<li><strong>Redis</strong>: For caching in the Search Gateway.</li>
</ul>
<h2>Current Memory Usage (Real Data)</h2>
<pre><code>$ ssh sayori "free -h"
               total        used        free      shared  buff/cache   available
Mem:           1.6Gi       765Mi        92Mi       2.0Mi       750Mi       672Mi
Swap:          2.0Gi       987Mi       1.0Gi
</code></pre>
<p><strong>Conclusion:</strong></p>
<ul>
<li>1.6GB RAM, 765MB used, 987MB Swap used.</li>
<li>14 containers, reasonable memory usage.</li>
<li>High Swap usage indicates memory is indeed tight, but it's still holding up.</li>
<li>Don't add any more heavy services.</li>
</ul>
<h2>Services Not Recommended for 2C2G</h2>
<p>These either hog memory, CPU, or storage; a 2C2G machine can't handle them:</p>
<h3>❌ Nextcloud / OwnCloud</h3>
<p><strong>Why not recommended:</strong></p>
<ul>
<li>High memory usage (PHP-FPM + database + Redis).</li>
<li>File uploads/downloads consume bandwidth and I/O.</li>
<li>Large file previews consume CPU.</li>
<li>Frequent sync conflicts.</li>
</ul>
<p><strong>Alternatives:</strong></p>
<ul>
<li>Lightweight file sync: Fast Note Sync (text only), Syncthing.</li>
<li>Cloud storage: Cloudflare R2 + Rclone.</li>
</ul>
<hr />
<h3>❌ Plex / Jellyfin / Emby</h3>
<p><strong>Why not recommended:</strong></p>
<ul>
<li>Video transcoding consumes CPU and memory.</li>
<li>Media library scanning consumes I/O.</li>
<li>40GB disk can't hold many movies.</li>
</ul>
<p><strong>Alternatives:</strong></p>
<ul>
<li>Use a dedicated NAS or media server.</li>
<li>Or just use online streaming services.</li>
</ul>
<hr />
<h3>❌ GitLab</h3>
<p><strong>Why not recommended:</strong></p>
<ul>
<li>Memory usage starts at 4GB.</li>
<li>A 2C2G machine simply cannot run it.</li>
</ul>
<p><strong>Alternatives:</strong></p>
<ul>
<li>GitHub / Gitea / Forgejo.</li>
<li>Gitea is much lighter, but still needs 512MB+ RAM.</li>
</ul>
<hr />
<h3>❌ Mastodon / Misskey</h3>
<p><strong>Why not recommended:</strong></p>
<ul>
<li>Federated social servers consume memory and database resources.</li>
<li>Media storage occupies disk space.</li>
</ul>
<p><strong>Alternatives:</strong></p>
<ul>
<li>Just use a public instance and register an account.</li>
</ul>
<hr />
<h3>❌ Local Large Models (Ollama / LM Studio)</h3>
<p><strong>Why not recommended:</strong></p>
<ul>
<li>2 cores will make inference painfully slow.</li>
<li>1.6GB RAM isn't enough for any useful models.</li>
</ul>
<p><strong>Alternatives:</strong></p>
<ul>
<li>Use public quotas: AnyRouter, SharedChat.</li>
<li>Use student coupons: Alibaba Cloud Bailian.</li>
<li>See also: <a href="/posts/anyrouter-sharedchat-cc-switch-student-guide/">How College Students Can Manage AI Quotas with AnyRouter, SharedChat, and cc-switch</a></li>
</ul>
<hr />
<h3>❌ WordPress (Not that it <em>can't</em> run, but it's not recommended)</h3>
<p><strong>Why it's not really recommended:</strong></p>
<ul>
<li>PHP + MySQL consume memory.</li>
<li>More plugins mean more consumption.</li>
<li>Static blogs (Astro / Hugo) offer better performance.</li>
</ul>
<p><strong>If you absolutely must run it:</strong></p>
<ul>
<li>Use Caddy + PHP-FPM + SQLite.</li>
<li>Install fewer plugins.</li>
<li>Configure Cloudflare CDN.</li>
</ul>
<h2>Recommended Learning Order</h2>
<p>I'd arrange it like this:</p>
<ol>
<li><strong>Basic setup</strong>: SSH, security groups, Docker, cost alerts.</li>
<li><strong>Domain and HTTPS</strong>: Free domain + Cloudflare DNS + Cloudflare Tunnel.</li>
<li><strong>Core services</strong>: Vaultwarden (password manager) + ntfy (notifications) + Gatus (monitoring).</li>
<li><strong>Add as needed</strong>: Fast Note Sync, bots, other tools.</li>
</ol>
<p>Don't install 10 services all at once. Take them one by one; add the next only after each is running stably.</p>
<h2>Related Resources</h2>
<p><strong>Self-hosted service discovery:</strong></p>
<ul>
<li>awesome-selfhosted: <a href="https://awesome-selfhosted.net/">https://awesome-selfhosted.net/</a></li>
<li>awesome-cloudflare: <a href="https://github.com/zhuima/awesome-cloudflare">https://github.com/zhuima/awesome-cloudflare</a></li>
</ul>
<p><strong>Projects mentioned in this article:</strong></p>
<ul>
<li>Vaultwarden: <a href="https://github.com/dani-garcia/vaultwarden">https://github.com/dani-garcia/vaultwarden</a></li>
<li>Fast Note Sync: <a href="https://github.com/haierkeys/obsidian-fast-note-sync">https://github.com/haierkeys/obsidian-fast-note-sync</a></li>
<li>ntfy: <a href="https://ntfy.sh/">https://ntfy.sh/</a></li>
<li>Gatus: <a href="https://gatus.io/">https://gatus.io/</a></li>
<li>AstrBot: <a href="https://github.com/Soulter/AstrBot">https://github.com/Soulter/AstrBot</a></li>
</ul>
<p><code>awesome-selfhosted</code> is good for finding "what else can I self-host." <code>awesome-cloudflare</code> is good for finding "what can be put on Cloudflare instead of a VPS."</p>
<p>A personal server isn't meant to carry everything. If Cloudflare Pages, Workers, R2, or Tunnel can do it, don't force your 2GB RAM machine to struggle.</p>
<hr />
<h2>Finally</h2>
<p>A 2C2G server is best suited as a "starting point for personal everyday services."</p>
<p>It lets you:</p>
<ul>
<li>Get familiar with Linux, Docker, reverse proxies, domains, HTTPS.</li>
<li>Run a few lightweight but useful services.</li>
<li>Develop habits for backups, security, and monitoring.</li>
</ul>
<p>It won't let you:</p>
<ul>
<li>Run heavy services.</li>
<li>Use it as a production server.</li>
<li>Replace a professional NAS or media server.</li>
</ul>
<p>But that's enough.</p>
<p>A server isn't "set it and forget it." It forces you to take backups, security, and monitoring seriously. Which is actually a good thing.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building & Self-hosting"></category>
  </entry>
  <entry>
    <title>Setting up Vaultwarden on a 2C2G Student Server: Don't Let Your Password Vault Run Naked</title>
    <link href="https://blog.sayori.org/en/posts/selfhost-vaultwarden-on-2c2g/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/selfhost-vaultwarden-on-2c2g/</id>
    <published>2026-06-22T00:00:00.000Z</published>
    <updated>2026-06-25T00:00:00.000Z</updated>
    <summary>Deploying Vaultwarden with Docker Compose on a student server, and clearly explaining the truly important parts: HTTPS, disabling registration, backup, and recovery drills.</summary>
    <content type="html"><![CDATA[<p>Vaultwarden is probably one of the most suitable services for a small 2C2G server.</p>
<p>It's lightweight, and its client ecosystem is mature; phones, computers, and browser extensions can all connect directly using official Bitwarden clients.</p>
<p>But it's also one of the services I least recommend just messing around with.</p>
<p>If your blog breaks, you can rebuild it. But if your password vault goes south, you lose accounts, 2FA, panel passwords, and even access to all your subsequent servers.</p>
<p>So, this post isn't about fancy tricks; it's about a practical approach that's good enough:</p>
<ol>
<li>Get it running with Docker Compose</li>
<li>Expose it only via HTTPS</li>
<li>Disable registration immediately after signing up</li>
<li>Don't procrastinate on backup and recovery</li>
</ol>
<p>Official Project:</p>
<p><a href="https://github.com/dani-garcia/vaultwarden">https://github.com/dani-garcia/vaultwarden</a></p>
<p>Compose Documentation:</p>
<p><a href="https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose">https://github.com/dani-garcia/vaultwarden/wiki/Using-Docker-Compose</a></p>
<h2>Who It's For</h2>
<p>I think it's suitable for these people:</p>
<ul>
<li>Already have their own small server</li>
<li>Want to keep their password data in their own hands</li>
<li>Are willing to deal with the dirty work of HTTPS, backups, and updates</li>
</ul>
<p>If you just want peace of mind, then official Bitwarden hosting, 1Password, or Apple Password Manager are all great options.</p>
<p>Vaultwarden's advantage isn't zero maintenance, but rather that it's lighter, more flexible, and better suited for a poor student's small machine.</p>
<h2>What You'll Need</h2>
<ul>
<li>A VPS capable of running Docker</li>
<li>A domain, or at least a stable HTTPS entry point</li>
<li>Docker and Docker Compose</li>
<li>Basic knowledge of SSH, reverse proxies, and firewalls</li>
</ul>
<p>If you haven't installed Docker yet, you can check out <a href="/posts/docker-compose-minimum-start/docker-compose-minimum-start-en/">Docker and Docker Compose Minimum Introduction: Understanding those YML files</a> first.</p>
<p>If you haven't set up a domain yet, you can check out <a href="/posts/free-domain-and-web-community/free-domain-and-web-community-en/">Get a Free Domain for Your New Blog, Then Show Your Face in the Webmaster Community</a> first.</p>
<h2>Create Directories</h2>
<p>I'll still put it in <code>/srv/stacks</code> here.</p>
<pre><code>sudo mkdir -p /srv/stacks/vaultwarden
sudo chown -R $USER:$USER /srv/stacks/vaultwarden
cd /srv/stacks/vaultwarden
mkdir -p vw-data
</code></pre>
<p>The directory structure will look something like this:</p>
<pre><code>/srv/stacks/vaultwarden/
  docker-compose.yml
  vw-data/
</code></pre>
<p>Later, the database, attachments, and other stuff will all be in <code>vw-data</code>.</p>
<h2>First, Write the Compose File</h2>
<pre><code>services:
  vaultwarden:
    image: ghcr.io/dani-garcia/vaultwarden:latest
    container_name: vaultwarden
    restart: unless-stopped
    environment:
      DOMAIN: "https://vault.example.com"
      SIGNUPS_ALLOWED: "true"
      INVITATIONS_ALLOWED: "false"
      ENABLE_WEBSOCKET: "true"
      TZ: "Asia/Shanghai"
    volumes:
      - ./vw-data:/data
    ports:
      - "127.0.0.1:8080:80"
</code></pre>
<p>Replace <code>vault.example.com</code> with your own domain.</p>
<p>The most important line here is:</p>
<pre><code>127.0.0.1:8080:80
</code></pre>
<p>This means Vaultwarden only listens on <code>8080</code> on the local machine.</p>
<p>The public internet won't hit it directly; it can only be routed through Nginx, Caddy, or Cloudflare Tunnel.</p>
<p>Don't just write it like this from the start:</p>
<pre><code>0.0.0.0:8080:80
</code></pre>
<p>Having your password vault directly exposed on a public HTTP port is a no-go.</p>
<p>A quick word on a few variables:</p>
<ul>
<li><code>DOMAIN</code>: The actual HTTPS address you'll access.</li>
<li><code>SIGNUPS_ALLOWED</code>: Temporarily enable it for the first registration, then turn it off.</li>
<li><code>INVITATIONS_ALLOWED</code>: Directly disable it for personal use.</li>
<li><code>ENABLE_WEBSOCKET</code>: Keep it enabled; client sync experience will be smoother.</li>
</ul>
<h2>Start It Up</h2>
<pre><code>docker compose up -d
docker compose logs -f vaultwarden
</code></pre>
<p>Check it locally:</p>
<pre><code>curl -I http://127.0.0.1:8080/
</code></pre>
<p>If it returns a status code, the container is alive.</p>
<p>But that's not the end of the setup, because what's truly important is HTTPS.</p>
<h2>Reverse Proxy and HTTPS</h2>
<p>You shouldn't run something like Vaultwarden on HTTP long-term.</p>
<p>Browser security contexts, password manager clients, and your own peace of mind all demand that you get HTTPS right.</p>
<p>I usually choose one of two paths.</p>
<h3>Option A: Caddy / Nginx</h3>
<p>Suitable if your domain points directly to the server and you're willing to open ports 80 and 443.</p>
<p>Caddy is the easiest:</p>
<pre><code>vault.example.com {
  reverse_proxy 127.0.0.1:8080
}
</code></pre>
<p>It handles certificates automatically.</p>
<p>Nginx works too; the core idea is the same: route <code>https://vault.example.com</code> to <code>127.0.0.1:8080</code>.</p>
<pre><code>server {
    listen 80;
    server_name vault.example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name vault.example.com;

    ssl_certificate /path/to/fullchain.pem;
    ssl_certificate_key /path/to/privkey.pem;

    location / {
        client_max_body_size 525M;
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
</code></pre>
<p>Don't forget to check after making changes:</p>
<pre><code>sudo nginx -t
sudo systemctl reload nginx
</code></pre>
<h3>Option B: Cloudflare Tunnel</h3>
<p>If you don't want your origin server to directly expose ports 80 and 443, then Tunnel is more comfortable.</p>
<p>The structure is:</p>
<pre><code>vault.example.com
  -&gt; Cloudflare
  -&gt; Cloudflare Tunnel
  -&gt; 127.0.0.1:8080
  -&gt; Vaultwarden
</code></pre>
<p>I personally lean towards this path because the origin server is a bit quieter.</p>
<p>However, there's a pitfall here: don't put Cloudflare Access login pages in front of the entire Vaultwarden instance.</p>
<p>Browser extensions and mobile clients might not handle that setup well.</p>
<p>If you really want to add extra protection, prioritize protecting only <code>/admin</code>.</p>
<h2>Disable Registration Immediately After First Signup</h2>
<p>After opening <code>https://vault.example.com</code> for the first time, set up your main account.</p>
<p>Once done, immediately change the configuration:</p>
<pre><code>SIGNUPS_ALLOWED: "false"
</code></pre>
<p>Then restart:</p>
<pre><code>docker compose up -d
</code></pre>
<p>Don't think your domain is obscure; public services will eventually be scanned.</p>
<h2>What to Do After Setting Up Your Account</h2>
<ul>
<li>Set a truly strong master password.</li>
<li>Enable two-factor authentication.</li>
<li>Only import passwords after confirming HTTPS is working correctly.</li>
<li>Before importing, export an offline backup from your old password manager.</li>
</ul>
<p>And here's a very realistic point:</p>
<p>Don't carelessly throw server SSH keys, panel passwords, and various root-level credentials into a password vault without a clear backup strategy.</p>
<p>Set it up first, then migrate gradually.</p>
<h2>Backup</h2>
<p>Vaultwarden's most important data is right here:</p>
<pre><code>/srv/stacks/vaultwarden/vw-data
</code></pre>
<p>The simplest approach is to first let it perform an internal backup, then package the entire directory.</p>
<pre><code>cd /srv/stacks/vaultwarden
mkdir -p backups
docker compose exec -T vaultwarden /vaultwarden backup
tar -czf backups/vaultwarden-$(date +%Y%m%d-%H%M%S).tar.gz docker-compose.yml vw-data
</code></pre>
<p>If you're using things like <code>.env</code>, SMTP, or admin tokens, back those up too, but don't put them in a public repository.</p>
<p>Then pull the backup back to your local machine, or sync it to another server.</p>
<pre><code>scp your-server:/srv/stacks/vaultwarden/backups/vaultwarden-20260625-030000.tar.gz .
</code></pre>
<p>Don't just keep it on the same server.</p>
<p>On-server backups often amount to no backup at all.</p>
<h2>Recovery Drill</h2>
<p>Only knowing how to back up, but not how to restore, is actually quite dangerous.</p>
<p>You should at least occasionally check if there's anything inside the backup package:</p>
<pre><code>tar -tzf backups/vaultwarden-20260625-030000.tar.gz | sed -n '1,30p'
</code></pre>
<p>Normally, you should see:</p>
<pre><code>docker-compose.yml
vw-data/
vw-data/db.sqlite3
</code></pre>
<p>When actually restoring, first stop the service, then move the old data aside:</p>
<pre><code>cd /srv/stacks/vaultwarden
docker compose down
mv vw-data vw-data.before-restore-$(date +%Y%m%d-%H%M%S)
tar -xzf backups/vaultwarden-20260625-030000.tar.gz
docker compose up -d
</code></pre>
<p>After restoring, check at least four things:</p>
<ul>
<li>The web page can be opened.</li>
<li>You can log in.</li>
<li>Entries are still there.</li>
<li>Browser extensions and mobile clients can sync.</li>
</ul>
<p>Don't wait until things actually blow up to learn how to restore for the first time.</p>
<h2>Updates</h2>
<p>Back up before updating; don't be lazy about this.</p>
<pre><code>cd /srv/stacks/vaultwarden
docker compose exec -T vaultwarden /vaultwarden backup
docker compose pull
docker compose up -d
docker compose logs --tail=100 vaultwarden
</code></pre>
<p>After updating, don't just look at the logs; click around on the web interface and client yourself to test it.</p>
<h2>Is It Suitable for 2C2G?</h2>
<p>Very suitable.</p>
<p>Vaultwarden itself doesn't consume much in terms of resources; a 2C2G server can run it easily.</p>
<p>The real cost isn't in CPU and memory, but in maintenance habits:</p>
<ul>
<li>HTTPS</li>
<li>Disabling registration</li>
<li>Backups</li>
<li>Recovery</li>
<li>Updates</li>
</ul>
<p>If you just want a service to screenshot and post on social media, then this isn't for you.</p>
<p>If you want to seriously start your self-hosting journey, it's actually very suitable as your first serious service.</p>
<p>Because a password vault will force you to complete many fundamental habits.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building & Self-Hosting"></category>
  </entry>
  <entry>
    <title>What can you buy with Alibaba Cloud's 300 RMB student voucher: A guide to using it before you waste it</title>
    <link href="https://blog.sayori.org/en/posts/aliyun-student-300-voucher-guide/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/aliyun-student-300-voucher-guide/</id>
    <published>2026-06-22T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>A compilation of the most practical ways to use Alibaba Cloud's 300 RMB student voucher: ECS, Lightweight Application Server, Wuying Lingdou, Bailian Large Model API, and pitfalls to watch out for before ordering.</summary>
    <content type="html"><![CDATA[<blockquote>
<p>[!NOTE]
This guide compiles methods verified as effective in June 2026. The scope of Alibaba Cloud vouchers can change, and the settlement page has the final say, so don't treat this as a permanent strategy. If you're reading this later, always confirm the deduction on the settlement page before placing an order.</p>
</blockquote>
<p>As everyone knows, Alibaba Cloud gives out 300 RMB vouchers to university students every year.</p>
<p>Sounds generous, right? But once you click into the console, you'll find this voucher isn't 300 RMB cash, nor can it be used for anything on the site. The official page states clearly: university students who pass student verification can claim a 300 RMB no-threshold coupon, valid for 1 year; it applies to some Alibaba Cloud public cloud products, with the actual deduction determined at the time of purchase.</p>
<p>What's more, the scope of this voucher is constantly shrinking. What worked last year might not work this year. So, I'd advise you not to just leave it sitting after you claim it; figure out how to spend it as soon as possible.</p>
<p>The entry point is here: <a href="https://university.aliyun.com/course/promotion25-activity?clubTaskBiz=subTask..12655012..10273..&amp;userCode=gv5jbukv">Student Benefits Claim Link</a></p>
<h2>How to Claim</h2>
<p>The process is short:</p>
<ol>
<li>Have an Alibaba Cloud account (registered with Alipay or phone number works)</li>
<li>Open the student benefits page</li>
<li>Complete student verification (usually via CHSI or university email)</li>
<li>Find the 'I am a student' entry and claim the 300 RMB deduction voucher</li>
</ol>
<p>Once verified, the voucher will appear in your coupon list. It's valid for one year, starting from the day you claim it.</p>
<p>If you don't have an Alibaba Cloud account yet, just register one. Even if you don't use a server later, Alibaba Cloud Bailian's large model API can also be paid for with the voucher.</p>
<h1>What Can It Be Used For?</h1>
<h2>Option 1: Annual ECS in Mainland China</h2>
<p>The most common use in forums is to get a 2C2G ECS in mainland China for one year. Since you can claim one voucher each year, you can essentially use it for as long as you're in university.</p>
<p>Reference post:</p>
<p><a href="https://linux.do/t/topic/2258128?u=amiya_desi">https://linux.do/t/topic/2258128</a></p>
<p>The general idea is:</p>
<ol>
<li>Go to the ECS custom purchase page</li>
<li>Select an e-instance around 2C2G</li>
<li>Choose Mainland China for the region (avoid regions marked 'discounted,' as the voucher might not work there)</li>
<li>For traffic billing, select CDT pay-as-you-go</li>
<li>Confirm the voucher can be deducted on the settlement page</li>
</ol>
<p>ECS custom purchase page:</p>
<p><a href="https://ecs-buy.aliyun.com/ecs/#/custom/">https://ecs-buy.aliyun.com/ecs/#/custom/</a></p>
<p>Key configurations verified to work in forums:</p>
<pre><code>实例规格：ecs.e-c1m1.large（2C2G）
付费模式：包年包月，一年
流量计费方式：CDT 按量计费
</code></pre>
<p>If you choose correctly, the settlement page should show less than 300 RMB, with the voucher directly deducting the cost, so you don't need to pay extra.</p>
<p>If it shows the voucher can't be used, try a different region. Some in the forums reported it working in Qingdao, others in South China; the rules vary at different times. The key is: look at the payment page, don't guess.</p>
<p>After enabling CDT, you get about 20GB of free traffic per month. This is perfectly sufficient for hosting blogs, bots, or small APIs, but don't use it for high-traffic download sites, image hotlinking, or video distribution.</p>
<p>The first thing to do after buying isn't installing a control panel, it's setting up cost alerts. CDT pay-as-you-go means charges will incur after exceeding the free quota. Set a threshold alert, even for 1 RMB, so you can detect issues promptly if attacked or misconfigured.</p>
<h2>Option 2: Lightweight Application Server</h2>
<p>If you don't want to delve into ECS, security groups, EIPs, CDT, and all that, a Lightweight Application Server is more like a 'pre-packaged mini VPS'.</p>
<p>Scroll down the student benefits page, or directly search for 'Lightweight Application Server' on the page:</p>
<p><a href="https://university.aliyun.com/buycenter/">https://university.aliyun.com/buycenter/</a></p>
<p>Here are a few routes I've seen:</p>
<p><strong>A. Get a 2C2G Lightweight server for 0 RMB for six months</strong></p>
<p>Some in the forums confirmed you can get a 2C2G Lightweight server with 200M bandwidth for 0 RMB for six months. The advantage is unlimited traffic (fixed bandwidth), so no worries about exceeding CDT. The downside is it only lasts for six months.</p>
<p><strong>B. Cloud Xiaozhan 38 RMB flash sale + voucher for renewal</strong></p>
<p>First, grab a 38 RMB annual Lightweight Application Server during a timed flash sale on Cloud Xiaozhan:</p>
<p><a href="https://www.aliyun.com/minisite/goods">https://www.aliyun.com/minisite/goods</a></p>
<p>It's said to be relatively easy to grab. After getting it, use the 300 RMB voucher to renew for another six months. This totals one and a half years for a total cost of 38 RMB.</p>
<p>Be careful with two things for this plan:</p>
<ul>
<li>The promotional price and student voucher might not stack. The actual display at checkout is what counts.</li>
<li>If the voucher can't be used for renewal, then 38 RMB only buys you one year, not one and a half.</li>
</ul>
<p><strong>C. Convert a trial ECS to a full subscription</strong></p>
<p>This is the path I took. Alibaba Cloud has a free trial entry point:</p>
<p><a href="https://free.aliyun.com">https://free.aliyun.com</a></p>
<p>You can try a 2C2G ECS for three months. Before or after the trial expires, use the 300 RMB voucher to convert to an annual subscription. This works out to about one year and three months or even longer.</p>
<p>Personally, I prefer Lightweight for beginners to practice with. Not because it's more advanced, but because it has fewer options, meaning fewer chances to get confused.</p>
<h2>Option 3: Non-Mainland Lightweight</h2>
<p>Non-Mainland China regions are a bit more mystical.</p>
<p>Feedback from forums suggests that non-Mainland ECS generally doesn't work well with vouchers, but some Lightweight Application Servers, in certain regions, with specific configurations, might. For example, some mentioned buying a 2C2G general-purpose type for 6 months, or a 2C0.5G for a year, totaling 336 RMB, requiring an additional 36 RMB after using the voucher; others opted for monthly renewals.</p>
<p>I don't recommend hardcoding specific regions here.</p>
<p>Hong Kong, Singapore, Japan, US, Germany, UK, Southeast Asia – the voucher rules for these regions might work today and not tomorrow. If you really want an overseas machine, just put the configuration in your cart and check the payment page.</p>
<p>If you're just setting up a blog, Cloudflare Pages is already sufficient.</p>
<h2>Option 4: Wuying Cloud PC and Lingdou</h2>
<p>You can now also find Wuying-related entries on the Alibaba Cloud student benefits page.</p>
<p>This option suits two types of people:</p>
<ul>
<li>Those who want to try a cloud PC for occasional software or gaming</li>
<li>Those who need to temporarily rent GPU computing power and don't want to buy a graphics card</li>
</ul>
<p>Some in the forums have compiled guides on how to use Wuying Lingdou and the Wuying Linggou platform, such as using Lingdou to set up a GPU environment with an RTX5880 48GB graphics card:</p>
<p><a href="https://linux.do/t/topic/2219866/60">https://linux.do/t/topic/2219866/60</a></p>
<p>These kinds of posts are better viewed as clues. Before actually paying, you still need to go back to the Alibaba Cloud settlement page to confirm Lingdou, region, and duration.</p>
<p>The good thing about this approach is it's cool, the bad thing is it's more like burning points based on usage. If you just want to host a service long-term, it's not as good as a server. If you're a research enthusiast, a model enthusiast, or need temporary VRAM, then it's worth checking out.</p>
<h2>Option 5: Bailian and Large Model APIs</h2>
<p>If you already have a server, or aren't interested in cloud servers, you can also use the 300 RMB to try out large model APIs.</p>
<p>The student benefits page has entry points for large model services, AI application development, and Alibaba Cloud Bailian. Cloud Xiaozhan also shows model-related activities like Bailian, Token Plan, and HappyHorse:</p>
<p><a href="https://www.aliyun.com/minisite/goods">https://www.aliyun.com/minisite/goods</a></p>
<p>If you want the voucher to be deducted, prioritize Alibaba Cloud's official direct-supply, pay-as-you-go models in the official console. Third-party intermediaries, marketplace products, or special activity packages might not accept this voucher.</p>
<p>You can use it to try:</p>
<ul>
<li>Tongyi Qianwen series (Qwen)</li>
<li>DeepSeek related APIs</li>
<li>Official models available on platforms like GLM / Kimi</li>
<li>Video models like HappyHorse, provided you confirm deduction on the settlement page</li>
</ul>
<p>The key is to select 'Official Direct-Supply Model' when calling. Some models in the Bailian console are marked 'Third-party' or 'Marketplace,' and those might not accept this voucher.</p>
<p>How many times can 300 RMB be used? This depends on the model you choose and the input length. For cheaper models like Tongyi Qianwen Turbo, 300 RMB can be used many, many times. For high-end large models, it will be much more expensive. Start with cheaper models to get the process working first.</p>
<p>This is more suitable for people who 'just want to try out APIs' than buying an idle server.</p>
<h2>Option 6: Get the ACA Large Model Engineer Certification for Free</h2>
<p>Alibaba Cloud has another neat trick: use the 300 RMB voucher to directly cover the ACA Large Model Engineer Certification fee.</p>
<p>The certification, originally 600 RMB, has a student discount price of exactly 300 RMB, making it 0 RMB after using the voucher.</p>
<p>Reference post:</p>
<p><a href="https://linux.do/t/topic/2456810">https://linux.do/t/topic/2456810</a></p>
<p>General process:</p>
<ol>
<li>Complete student verification and claim the 300 RMB voucher</li>
<li>Scroll down the student benefits page to find the 'Large Model Certification' section</li>
<li>Click 'Buy Now' and use the voucher for deduction</li>
</ol>
<p>This certification is an official Alibaba Cloud professional certification, aimed at beginners. While its value might not be super high, for students, getting a certificate for 0 RMB and learning basic large model knowledge along the way is a good deal.</p>
<p><strong>Who it's for:</strong></p>
<ul>
<li>Those who need to add a certification to their resume</li>
<li>Those who want to systematically learn basic large model concepts</li>
<li>Those who already have a server or aren't interested in servers</li>
</ul>
<p><strong>Who it's not for:</strong></p>
<ul>
<li>People already doing large model development (too basic)</li>
<li>People who'd rather use the voucher for a server (opportunity cost)</li>
</ul>
<p>If your voucher is about to expire and you don't currently need a server or API, using it for this certification isn't a bad idea.</p>
<h2>How I'd Choose</h2>
<p>If it's your first time playing with cloud services, I'd prioritize like this:</p>
<ol>
<li>Claim the voucher first</li>
<li>Check if there's a 2C2G ECS or Lightweight server that can use the voucher</li>
<li>If you can get a server for 0 RMB or with a small top-up, get the server first</li>
<li>Once you have the server, immediately set up SSH, security groups, and cost alerts</li>
<li>Then run small services like Vaultwarden, ntfy, Gatus, bots, note synchronization, etc.</li>
</ol>
<p>If you already have a VPS, don't buy another machine that will just gather dust just to spend the voucher. Using it to try Bailian API or Wuying Lingdou is more like actually using the money.</p>
<h2>Check Before Ordering</h2>
<p>Don't rush to pay, check these first:</p>
<ul>
<li>Does the payment page show the 300 RMB voucher deduction?</li>
<li>Is the order annual/monthly subscription, or pay-as-you-go?</li>
<li>Will it auto-renew after expiration?</li>
<li>How are traffic, bandwidth, and public IP charged?</li>
<li>Is there a risk of default open security group rules?</li>
<li>Can cost alerts and quota warnings be set?</li>
<li>Can the voucher be reused for the same product category after a refund?</li>
</ul>
<p>Especially the last point. Official rules state that after a refund for an order using a voucher, the returned voucher cannot be reused for the corresponding product category. Don't use it to randomly test orders.</p>
<h2>What to Read Next</h2>
<p>If you ended up getting a 2C2G server like the site owner, you can continue with these posts:</p>
<ul>
<li><a href="/posts/student-2c2g-server-service-index/2c2g-server-service-index/">2c2g-server-service-index</a></li>
<li><a href="/posts/selfhost-vaultwarden-on-2c2g/selfhost-vaultwarden-on-2c2g-en/">Setting up Vaultwarden on a 2C2G Student Server</a></li>
<li><a href="/posts/fast-note-sync-on-student-server/fast-note-sync-on-student-server-en/">Fiddling with Fast Note Sync on a Student Server</a></li>
</ul>
<p>The best way to use this voucher isn't to 'grab and go,' but to exchange it for a low-cost opportunity to practice.</p>
<p>Servers, domains, Cloudflare, Docker, backups, monitoring – these things seem fragmented at first. But once you actually get a small service running, connect it to a domain, and then back it up, you'll find they all tie together.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Tools & Resources"></category>
  </entry>
  <entry>
    <title>Tinkering with Fast Note Sync on a Student Server: A Private Sync Layer for Obsidian</title>
    <link href="https://blog.sayori.org/en/posts/fast-note-sync-on-student-server/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/fast-note-sync-on-student-server/</id>
    <published>2026-06-22T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>Running Fast Note Sync Service on a 2C2G student server, carving out a private route for Obsidian multi-device sync, backup, and REST/MCP interfaces.</summary>
    <content type="html"><![CDATA[<p>I write all my blog posts and project notes in Obsidian now, but I started writing everything on my computer. After accumulating a bunch of stuff, I realized I couldn't write on my phone, so I went looking for a sync service.</p>
<p>Official Obsidian Sync is certainly hassle-free, though your wallet might not be; Syncthing, Git, and WebDAV all have their own methods, but I found them inconvenient.</p>
<p>Eventually, I stumbled upon the Fast Note Sync plugin, which I saw mentioned in the comments while browsing L-station: it's an Obsidian plugin + self-hosted backend, aiming for real-time multi-device sync. It also conveniently adds version history, attachments, web management, REST API, MCP, and other features. After a few days of hands-on configuration, I found it genuinely excellent b(￣▽￣)d</p>
<p>Plugin:</p>
<p><a href="https://github.com/haierkeys/obsidian-fast-note-sync">https://github.com/haierkeys/obsidian-fast-note-sync</a></p>
<p>Backend:</p>
<p><a href="https://github.com/haierkeys/fast-note-sync-service">https://github.com/haierkeys/fast-note-sync-service</a></p>
<p>Obsidian Plugin Page:</p>
<p><a href="https://community.obsidian.md/plugins/fast-note-sync">https://community.obsidian.md/plugins/fast-note-sync</a></p>
<h2>Who it's for</h2>
<p>I think it's suitable for these people:</p>
<ul>
<li>Already writes a lot of content in Obsidian</li>
<li>Has a small server that's online 24/7</li>
<li>Willing to handle HTTPS, reverse proxy, and backups themselves</li>
<li>Wants to be able to write notes anytime, anywhere</li>
</ul>
<p>This way, even if your computer isn't with you, you can easily write articles on your phone, and it'll sync up once you're back on your computer.</p>
<h2>Deploying the Backend</h2>
<p>The backend repository is here:</p>
<p><a href="https://github.com/haierkeys/fast-note-sync-service">https://github.com/haierkeys/fast-note-sync-service</a></p>
<p>It's a Go-based backend, and the repository description states it's a high-performance, low-latency note sync, online management, and remote REST API service platform.</p>
<p>I'll start by creating directories:</p>
<pre><code>sudo mkdir -p /srv/stacks/fast-note-sync
sudo chown -R $USER:$USER /srv/stacks/fast-note-sync
cd /srv/stacks/fast-note-sync
</code></pre>
<p>Then, I'll deploy it according to the official documentation, choosing Docker, binary, or source compilation. Whichever method I pick, I'll try to make the service only listen on the local address, then expose HTTPS using a reverse proxy or Tunnel.</p>
<p>The idea is:</p>
<pre><code>Fast Note Sync Service
  -&gt; 只监听 127.0.0.1:&lt;服务端口&gt;
  -&gt; Caddy / Nginx / Cloudflare Tunnel
  -&gt; notes.example.com
</code></pre>
<p>If using Docker Compose, at least keep these habits:</p>
<ul>
<li>Persist data directories to the current service directory</li>
<li>Don't commit configuration files to public repositories</li>
<li>Don't directly expose service ports to the public internet</li>
<li>Back up data directories before updating</li>
</ul>
<p>Your notes are in the sync service; it shouldn't be running exposed.</p>
<h2>Connecting a Domain</h2>
<p>You can use Caddy / Nginx, or Cloudflare Tunnel.</p>
<p>For example, domain:</p>
<pre><code>notes.example.com
</code></pre>
<p>Structure:</p>
<pre><code>notes.example.com
  -&gt; HTTPS
  -&gt; 127.0.0.1:&lt;服务端口&gt;
  -&gt; fast-note-sync-service
</code></pre>
<p>If you don't have a domain yet, you can check out:</p>
<p><a href="/posts/free-domain-and-web-community/free-domain-and-web-community-en/">Get a free domain for your new blog, then show your face in the webmaster community</a></p>
<p>I don't recommend direct access:</p>
<pre><code>http://服务器IP:&lt;服务端口&gt;
</code></pre>
<p>At least HTTPS, preferably with additional access protection.</p>
<h2>Initializing Account and Plugin</h2>
<p>The process described in the backend README is roughly:</p>
<ol>
<li>Open the Web management interface</li>
<li>Register an account on first visit</li>
<li>Copy API configuration from the backend</li>
<li>Paste the configuration into Obsidian plugin settings</li>
</ol>
<p>Manually download <code>main.js</code>、<code>styles.css</code>、<code>manifest.json</code> from GitHub Releases and place them into:</p>
<pre><code>.obsidian/plugins/fast-note-sync/
</code></pre>
<p>Then go to the plugin page and activate it. You'll need to create and copy a token from the web interface, then paste it into the remote configuration. It usually starts up after a short while.</p>
<h2>Backup is More Important Than Sync</h2>
<p>This sentence needs to be written separately. Sync will propagate deletions, and it will also propagate errors.</p>
<p>Fast Note Sync itself supports version history, recycle bin, backup, mirroring, Git sync, and other features, but you still need your own fallback plan.</p>
<p>If you're already syncing Obsidian with Git, don't immediately add another layer of real-time sync. First, figure out who is the primary sync and who is the backup.</p>
<h2>My Thoughts on MCP and REST API</h2>
<p>Fast Note Sync Service now also offers REST API and MCP support.</p>
<p>This is very appealing to me. Because a lot of my content is in Obsidian, if AI clients can read and write notes through controlled interfaces in the future, then it won't just be a sync tool, but an entry point to my personal knowledge base.</p>
<p>But this also comes with risks.</p>
<p>If AI can read and write your notes, it means permission boundaries need to be clearer:</p>
<ul>
<li>Don't expose the MCP interface to the public internet</li>
<li>Don't grant write permissions to untrusted clients</li>
<li>Don't mix private diaries, account information, or keys in an open Vault</li>
<li>For important Vaults, start with read-only access, and only consider write access after confirming the process.</li>
</ul>
<p>'AI integration' is not a reason to immediately grant full permissions.</p>
<h2>Is it Resource-Intensive on a 2C2G Server?</h2>
<p>For normal personal use, it should be fine.</p>
<p>What truly consumes resources are the number of attachments, sync frequency, and whether you're stuffing an entire multi-gigabyte asset library into Obsidian.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building & Self-Hosting"></category>
  </entry>
  <entry>
    <title>Building Your Own Blog from Scratch: GitHub, Cloudflare Pages, Mizuki, and Obsidian</title>
    <link href="https://blog.sayori.org/en/posts/astro-mizuki-blog-from-zero/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/astro-mizuki-blog-from-zero/</id>
    <published>2026-06-19T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>Starting from registering GitHub and Cloudflare, writing articles with my Obsidian blog template, and then publishing to Cloudflare Pages using GitHub Actions.</summary>
    <content type="html"><![CDATA[<h1>Building Your Own Blog from Scratch: GitHub, Cloudflare Pages, Mizuki, and Obsidian</h1>
<blockquote>
<p>[!NOTE]
It's the AI era now. If you can't figure out how to install environments like Node.js, Git, or pnpm, you can totally let AI help you. Just download a free AI like opencode or trae, and it can even handle pulling GitHub repositories and configurations. But then, what's the fun in that? Even though I, the site owner, did it that way, since I'm writing a tutorial, I should probably make one that you can do by hand.</p>
<p>Here's a funny thing: I only found out I needed to install pnpm when I was writing this. Before, I just let Codex deploy everything for me. But hey, it's pretty good! Writing articles like this helps me deeply understand the stuff AI helped me set up!</p>
</blockquote>
<p>Once you're done, you'll have:</p>
<pre><code>GitHub 仓库
Cloudflare Pages 项目
Obsidian 写作目录
Astro/Mizuki 博客
GitHub Actions 自动部署
</code></pre>
<p>The final address you open will look something like this:</p>
<pre><code>https://你的项目名.pages.dev
</code></pre>
<p><img src="https://img.sayori.org/blog/v1/a5583eaee7909e6b27fae2dbd310cd2c78566107a42e01d35e1041d9c590348e/1280.webp" alt="Pasted image 20260620202027.png" /></p>
<h2>First, Register for GitHub and Cloudflare</h2>
<p>If you don't have these two accounts, it's best to register for them. GitHub and Cloudflare are both famous cyber philanthropists! And generally, the earlier you register for a GitHub account, the more benefits you can enjoy!</p>
<p>First, register for GitHub:</p>
<p><a href="https://github.com/signup?return_to=%2F&amp;source=login">Sign up for GitHub · GitHub</a></p>
<p>GitHub is used to host your blog repository and can also use Actions to implement an automatic upload workflow after commits.</p>
<p>If you can't register, try switching nodes, using an incognito browser, or registering on your phone. For example, I ended up registering on my phone QAQ~~*those were my steps, haha.</p>
<p>Next, register for Cloudflare:</p>
<p><a href="https://dash.cloudflare.com/sign-up">https://dash.cloudflare.com/sign-up</a></p>
<p>This registration is quite easy. I, the site owner, could register with a random Outlook email. Truly a CF philanthropist.</p>
<p>Cloudflare Pages is used to host your blog. It will put the built static files on Cloudflare's network and give you a <code>pages.dev</code> domain.</p>
<p><a href="https://github.com/zhuima/awesome-cloudflarE">https://github.com/zhuima/awesome-cloudflarE</a>, here's also a CF usage guide with 14k stars on GitHub, I recommend everyone save it!</p>
<h2>Install Local Tools</h2>
<p>Download these tools from their official websites:</p>
<ul>
<li>Node.js: <a href="https://nodejs.org/">https://nodejs.org/</a></li>
<li>pnpm: <a href="https://pnpm.io/installation">https://pnpm.io/installation</a></li>
<li>Git: <a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a></li>
<li>Obsidian: <a href="https://obsidian.md/download">https://obsidian.md/download</a></li>
</ul>
<p>After installation, open your terminal and check:</p>
<pre><code>node -v
git -v
pnpm -v
</code></pre>
<p>If <code>pnpm -v</code> yields no results, you can enable it with Corepack:</p>
<pre><code>corepack enable
corepack prepare pnpm@latest --activate
</code></pre>
<p>Windows users are advised to use PowerShell first. macOS and Linux users can just use the system's built-in terminal.</p>
<h2>Create a New GitHub Repository</h2>
<p>Open GitHub, click New repository.</p>
<p>For the repository name, you can write:</p>
<pre><code>my-blog
</code></pre>
<p>After creating it, clone the repository to your local machine:</p>
<pre><code>git clone https://github.com/你的用户名/my-blog.git
cd my-blog
</code></pre>
<p><img src="https://img.sayori.org/blog/v1/a9a5f9da0fbeb6efb10dbeb40d4df4f9e2abed8d267cc882254a762cba10428e/1280.webp" alt="Pasted image 20260621115726.png" /></p>
<p><img src="https://img.sayori.org/blog/v1/e1754ee375ad12d1759649b3c206f7bc7f14f661e79121fb9586a88bff7e27af/1280.webp" alt="Pasted image 20260621115948.png" /></p>
<h2>Add My Obsidian Blog Template</h2>
<p>I'm not directly using the official Mizuki content repository here.</p>
<p>You can see the official content repository here:</p>
<p><a href="https://github.com/matsuzaka-yuki/Mizuki-Content">https://github.com/matsuzaka-yuki/Mizuki-Content</a></p>
<p>But I usually write articles using Obsidian, so I've put together my own template. This template places the writing source in <code>articles/</code>, and then a script syncs it to the directory Mizuki needs.</p>
<p>The template now also retains two writing styles: regular articles and essays. Regular articles are placed in <code>articles/posts/&lt;slug&gt;/&lt;slug&gt;.md</code> and will generate independent pages; shorter notes can be placed in <code>articles/essays/&lt;slug&gt;.md</code>, and after publishing, they will be aggregated on the essays page.</p>
<p>Template repository:</p>
<p><a href="https://github.com/Amiyadesi/astro-mizuki-blog-from-zero">https://github.com/Amiyadesi/astro-mizuki-blog-from-zero</a></p>
<p>If you use this template directly, the final directory should look like this:</p>
<pre><code>my-blog/
  articles/
    posts/
    friends/
    spec/
    site/
    assets/
  blog/
    package.json
    src/
    scripts/
  .github/
    workflows/
      deploy-cloudflare-pages.yml
</code></pre>
<p>Remember this one thing first:</p>
<pre><code>articles/ 是你写东西的地方
blog/ 是网站程序本体
</code></pre>
<p>In the future, don't manually write articles in <code>blog/src/content/posts</code>. That directory is a synced output.</p>
<h2>Open 'articles' with Obsidian</h2>
<p>Open Obsidian, select:</p>
<pre><code>打开本地文件夹
</code></pre>
<p>Then choose:</p>
<pre><code>my-blog/articles
</code></pre>
<p><img src="https://img.sayori.org/blog/v1/993a0b6b532712efb91b9d7a9499010dc4103fa8ac8dd6e658b773717d6a1030/1280.webp" alt="Pasted image 20260620204835.png" /></p>
<p>This directory will be your blog's backend from now on.</p>
<p>Remember these common locations first:</p>
<pre><code>articles/posts/             文章
articles/friends/           友链卡片
articles/spec/about.md      关于页
articles/spec/friends.md    友链页正文和申请说明
articles/site/profile.json  头像、昵称、简介、社交链接
articles/site/navigation.json 导航栏
articles/site/banner.json   首页 Banner 和文案
articles/assets/            头像、Banner、音乐、友链头像等素材
</code></pre>
<p>If you find these JSON files hard to modify, you can directly search for 'site-config-hub' in Obsidian.</p>
<p>Here, the About page, Friends page, site JSON, and asset directory are all centrally located, making them easier to modify.</p>
<h2>Local Plugin Startup</h2>
<p>After installation, open the third-party plugins page in Obsidian settings and enable the plugins included with the template.</p>
<p><img src="https://img.sayori.org/blog/v1/c7537f8534ae64dc020b418e95661694d746cb9e03836fd2ff36721f3ce3f007/598.webp" alt="Pasted image 20260621211602.png" /></p>
<p>Enable third-party plugins, check the one that exists by default.
<img src="https://img.sayori.org/blog/v1/eee393c31ffc12470425d2eb730ddf52a34aa68159910b1929a8376a27c7c401/1280.webp" alt="Pasted image 20260621200606.png" /></p>
<p>Then two new items will appear in the left sidebar.</p>
<p><code>本地预览博客</code> button and <code>一键推送按钮</code>
<img src="https://img.sayori.org/blog/v1/9d546dc09d8b3892d1be557ee50aef38fd828669824f448fea202525bd2d936d/273.webp" alt="Pasted image 20260621141446.png" /></p>
<p><code>本地预览博客</code> automatically does these things under the hood:</p>
<pre><code>同步 articles -&gt; blog 内容
如果 blog 依赖还没装好，自动安装依赖
本地 build 博客
启动本地预览服务
</code></pre>
<p>So, the first time you click the local preview button, if <code>blog/node_modules</code> doesn't exist yet, it will first complete the dependencies in the background, which will take a bit longer; subsequent clicks will be much faster.</p>
<p>It looks like a button, but behind it, it's still calling local tools like Node, pnpm, and Git. The difference is that during normal use, you don't have to go into the command line yourself to handle installation, syncing, building, and pushing.</p>
<p>After successful startup, it will automatically redirect you to the local preview address and switch to an active state.</p>
<pre><code>Blog: http://127.0.0.1:4173/
</code></pre>
<p>This button is a toggle:</p>
<pre><code>第一次点：启动预览并自动打开浏览器
第二次点：停止预览服务
</code></pre>
<p>The other one is automatic commit and upload after clicking.</p>
<h2>Write Your First Article</h2>
<p>Create a new folder under 'post' to put everything an article needs, then create a new article and insert the template.
<img src="https://img.sayori.org/blog/v1/d34dd9cc33ada7390bf19ab5bbcbfe912bd0c48ec127c5bb85f5bd761cb0492e/550.webp" alt="Pasted image 20260621202714.png" />
<img src="https://img.sayori.org/blog/v1/dcd39b15dfdee7ef8b8513dd8509021eec22ded1e4b781b00a3c9705e26a906f/1280.webp" alt="Pasted image 20260621202726.png" />
<img src="https://img.sayori.org/blog/v1/4425e707836c976750f7eaf9453dada829b1344d42348e50338576667fc9777b/1280.webp" alt="Pasted image 20260621203145.png" /></p>
<p>Then you can happily start writing! Common Markdown and some Obsidian syntax are all supported for parsing!</p>
<p>In the default template, <code>draft: true</code> is a draft. If you're ready to publish, change it to <code>draft: false</code>; if this is just a short note and you don't want it to appear as a standalone article, you can put it as a single Markdown file into <code>articles/essays/</code>.</p>
<p>If you want to place two or more photos side-by-side, you don't need to write HTML by hand; you can write it like this:</p>
<pre><code>:::photo-grid
![[left.png|左边照片说明]]
![[right.png|右边照片说明]]
:::
</code></pre>
<p>The description below the image will take the text after <code>|</code>. Regular Markdown images also support the same layout:</p>
<pre><code>![说明](photo.png)
</code></pre>
<p>They will appear side-by-side on a computer and automatically stack into a single column on a phone.</p>
<p>There's also a black block hint, suitable for answers, spoilers, or content you don't want to see at first glance:</p>
<pre><code>这里有一个 {{被遮住的内容|鼠标移上去会看到提示}}。
</code></pre>
<p>After publishing to the blog, hovering over it with the mouse or selecting it with the keyboard will reveal the main text and hint; tapping on a phone will also expand it.</p>
<h2>Sync and Build</h2>
<p>Just click the button in the image, assuming you've already configured GitHub secrets. This template comes with actions built-in.
<img src="https://img.sayori.org/blog/v1/2fef58433ac265459aa0e82d0a1c7ccb6a36d3901e43b5dd2d87c20350b63f32/357.webp" alt="Pasted image 20260621203335.png" /></p>
<p>This button will commit and push your articles, configurations, and synced blog content to GitHub. After a successful push, it's not your local machine directly deploying, but GitHub Actions that then builds the blog and publishes it to Cloudflare Pages.</p>
<p>And how to configure it is right below!</p>
<h2>Create a Cloudflare API Token</h2>
<p>Open Cloudflare's API Token page:</p>
<p><a href="https://dash.cloudflare.com/profile/api-tokens">https://dash.cloudflare.com/profile/api-tokens</a></p>
<p>Create a Token; these permissions are sufficient.</p>
<p><img src="https://img.sayori.org/blog/v1/17f7c94ad1dfde01f1bcdcdaba563dd1268709991d4ab7cb138397c623e7572c/1280.webp" alt="Pasted image 20260621204437.png" /></p>
<p>You need to save three things:</p>
<pre><code>CLOUDFLARE_ACCOUNT_ID
CLOUDFLARE_API_TOKEN
CLOUDFLARE_PROJECT_NAME
</code></pre>
<p><code>CLOUDFLARE_ACCOUNT_ID</code> can be seen in the bottom right corner of Workers &amp; Pages, it's in the image above (lol).</p>
<p><code>CLOUDFLARE_API_TOKEN</code> will only be fully displayed once. Copy it and quickly fill it into GitHub Secrets.</p>
<p><code>CLOUDFLARE_PROJECT_NAME</code> is the name the Action will use to automatically create the Pages project.</p>
<h2>Configure GitHub Secrets</h2>
<p>Go back to your GitHub repository page.</p>
<p>Go to:</p>
<pre><code>Settings -&gt; Secrets and variables -&gt; Actions -&gt; New repository secret
</code></pre>
<p><img src="https://img.sayori.org/blog/v1/c62668f3354a8b4c4a9fa804d91ad5d442dca937c8a06e05df722430ceaf3538/1280.webp" alt="Pasted image 20260621205455.png" />
<img src="https://img.sayori.org/blog/v1/c68ae3f1e41832d33a5a97a234283c03cdd987d6f1285c94a520dc4779bd62a4/1280.webp" alt="Pasted image 20260621205519.png" /></p>
<p>Add these three:</p>
<pre><code>CLOUDFLARE_ACCOUNT_ID
CLOUDFLARE_API_TOKEN
CLOUDFLARE_PROJECT_NAME
</code></pre>
<p>Names and values correspond.</p>
<h2>Confirm GitHub Actions Workflow</h2>
<p>This file is already in the template:</p>
<pre><code>.github/workflows/deploy-cloudflare-pages.yml
</code></pre>
<p>What it does is roughly:</p>
<pre><code>拉取仓库
安装 Node 和 pnpm
进入 blog/
安装依赖
构建 Astro/Mizuki
用 Wrangler 把 dist 上传到 Cloudflare Pages
</code></pre>
<p>Of course, it's best to start a local preview and check before committing.</p>
<h2>Commit and Publish</h2>
<p>After pushing, open your GitHub repository's Actions page.</p>
<p>If you see a green checkmark, it means deployment was successful.</p>
<p>If it fails, click in to see the logs. There are only a few common issues:</p>
<pre><code>Secrets 名字拼错
Cloudflare Token 权限不够
PROJECT_NAME 填错
blog/ 构建失败
pnpm-lock.yaml 和依赖不一致
</code></pre>
<h2>Open pages.dev</h2>
<p>After successful deployment, open:</p>
<pre><code>https://你的项目名.pages.dev
</code></pre>
<p>If you can see the page, it means the first part is done.</p>
<p>By this point, you have a blog that you can write on, preview, and automatically deploy.</p>
<h2>Let's Stop Here for This Part</h2>
<p>The next part will cover domains, comment systems, and other small internet-related things, services, and communities relevant to site owners!</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building & Self-Hosting"></category>
  </entry>
  <entry>
    <title>Blog Author 9 Questions: My Answers</title>
    <link href="https://blog.sayori.org/en/posts/blog-author-9-questions-answer/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/blog-author-9-questions-answer/</id>
    <published>2026-06-12T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>My answers to Another Dayu's 9 questions for blog authors.</summary>
    <content type="html"><![CDATA[<p>This post is my answer to Another Dayu's blog author questionnaire.</p>
<p>The original questionnaire is here: <a href="https://anotherdayu.com/2024/5962/">Hey Blog Author, I want to interview you with these 9 questions!</a></p>
<h2>1. Who I am, and what this blog is about</h2>
<p>I'm Amiya_desi.</p>
<p>This blog is called "Amiya's Desk". It's mainly for recording my thoughts and ideas, and occasionally writing some technical articles or other stuff. I also share resources I can make public here. It's basically an open window I've built for myself on the internet.</p>
<h2>2. Why I started blogging</h2>
<p>Initially, I just wanted to share some resources. I grew by finding all sorts of free internet resources and others' sharing, so I wanted to share back and pass it on.</p>
<p>Later, I figured besides posting resources, since I already had this kind of website, I might as well write whatever I wanted. Plus, it's a way to leave more traces of myself on the internet or something.</p>
<h2>3. How I complete an article</h2>
<p>How do I complete an article, huh? Generally, my articles fall into two categories: those written for myself, and those written with an audience in mind. I'm currently trying to increase the proportion of the latter; the former are mostly historical relics, hehe.</p>
<p>For the latter type of article, I usually start by figuring out what I want to write about. Then I let AI draft an initial version for me. After that, I fill in the "human" parts on the framework AI has provided.</p>
<h2>4. Have I ever lost motivation?</h2>
<p>Motivation hasn't been lost, at least not yet, since it hasn't been established for long. Also, recently, because I can't figure out how to make games, I've had to channel my energy here. At least it comforts me that I'm still producing something. Whether it's an illusion or not, who knows?</p>
<h2>5. Setup method and cost</h2>
<p>Currently, it's roughly:</p>
<pre><code>Obsidian       -&gt; 写日记和文章
articles/      -&gt; 本地内容源
Astro/Mizuki   -&gt; 博客构建
GitHub         -&gt; 版本记录和远端同步以及触发cf工作流自动部署
Cloudflare Pages -&gt; 静态部署
</code></pre>
<p>The main costs are the domain and time.</p>
<p>Cloudflare Pages itself is free, and GitHub is also free. The sayori.org domain costs about $10 a year. I chose .org because I like open source, and I chose 'sayori' because I like Sayori. It's that simple, and the cost isn't high anyway.</p>
<h2>6. Recommend one of my own articles, and a blog I like</h2>
<p>I'll start by recommending this article of mine:</p>
<p><a href="/posts/age-18-to-19-record/age-18-to-19-record-en/">age-18-to-19-record</a></p>
<p>This is one I finished recently, a summary of my past. It's strange, I never used to write this kind of thing. I preferred writing about current feelings in the past. Long-term memories seem to be fewer... maybe I'm getting old (laughs).</p>
<p>A blog I like, huh? I haven't read many blogs lately. For many, I just explore a bit and then quickly leave. If you ask about a blog I still remember, there is one: they're a fellow enthusiast and a Bilibili creator, they even like people trying to 'unbox' them, and their website is pretty good. I even wrote about it, so it left an impression: <a href="https://ftz.is-a.dev/?d=ftx">for_the_zero's little site</a></p>
<h2>7. Things I've been enjoying lately</h2>
<p>Perhaps it's writing articles. At least it makes me feel like I'm still producing, still creating. Also building websites and making videos – at least I can keep doing these. Unlike games right now, I have no inspiration for projects... and I don't know how to learn.</p>
<h2>8. Things I want to do but haven't yet</h2>
<p>I want to fill this blog with all sorts of technical articles and resource compilations, as well as my daily thoughts, so the internet can piece together my shape.</p>
<p>Technically, I also want to continue making videos, learn drawing, learn music production, learn game design, learn how to develop games better, learn how to use AI better, and learn more other interesting technologies (it seems I've recently even wanted to learn Japanese, and even English. Come on, I haven't studied for half a year... Oh well, I'll just note it down for now).</p>
<p>In life, learn musical instruments, learn to dance, learn to sing, learn to live alone, learn to cook better, learn how to interact with people.</p>
<p>After writing it all down, I realize there's so much to do. I really am a cunning and greedy person, haha.</p>
<h2>9. Final thoughts</h2>
<p>Finally, this questionnaire is answered. My blog has one more article, a relatively authentic one to showcase. And you, who posed the questions, have received a fresh set of answers. A win-win, hehe!</p>
<p>Thanks to you for reading this far! If you're interested in me, feel free to get to know me. You can DM me on various platforms or try adding my main social media accounts!</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Log"></category>
  </entry>
  <entry>
    <title>My Answers to the 15 Self-Reflection Questions for Independent Blogs</title>
    <link href="https://blog.sayori.org/en/posts/independent-blog-self-check-15-draft/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/independent-blog-self-check-15-draft/</id>
    <published>2026-06-12T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>My answers to Ya Yu's 15 self-reflection questions for independent blogs, a self-check on my relationship with this blog.</summary>
    <content type="html"><![CDATA[<p>This post is my answer to Ya Yu's self-reflection questionnaire for independent blogs.</p>
<p>The original questionnaire is here: <a href="https://yayu.net/4626.html">15 Self-Reflection Questions for Independent Blogs</a></p>
<h2>1. Update Frequency</h2>
<p>If I include my diary entries, I'm probably updating faster than 99% of webmasters nationwide (lol).</p>
<p>But if we only count proper articles, then it's probably one or two per week.</p>
<h2>2. Last Update</h2>
<p>Pretty much yesterday! My update frequency is still quite high.</p>
<p>My current publishing workflow is: write, sync, build, deploy. The technical side isn't the biggest issue; the problem has become "should I even publish this?" because I lack confidence, and many things have already been posted by others online. But, how to put it, if I only want exclusive content, it's really difficult and unrealistic. So, I'll just accept the gap and keep publishing!</p>
<h2>3. Originality</h2>
<p>Originality? Absolutely. <s>Youthful musings, you know.</s> But if we're talking about a human touch, it's probably still lacking a bit. Usually, I'll think of a topic, then have AI generate a rough draft for me, and then I'll modify it myself based on that draft. This very post is an example (lol).</p>
<h2>4. Helpfulness to Others</h2>
<p>I definitely think my bookmark resource compilation should be quite useful, yeah.</p>
<p>And then there's the style of my navigation site; I once pulled out a pretty good-looking design that drew praise from many community members and became a template and source of inspiration for some. That should count as quite helpful.</p>
<p>And my articles, being seen, thought about, and commented on by others, should also be helpful.</p>
<p>Recently, I've also written some tutorial articles and plan to link them with videos, so the tutorials and videos can complement each other.</p>
<h2>5. Last Theme or Software Change</h2>
<p>The blog's foundation is Mizuki, and the theme is pretty much set. If we're talking about adding small things, then I've gradually added some minor services and such.</p>
<h2>6. Last Time Tinkering with Theme Code</h2>
<p>That's pretty much now, since when I'm intensely reviewing my own blog and admiring others', I always want to tweak things that are similar or didn't feel quite right after actual use.</p>
<h2>7. Secondary Development</h2>
<p>As for the navigation page, it was a gacha-luck explosion (lol), developed entirely by Claude Code.</p>
<p>For the blog, if 'secondary development' means adding other things on top of the original, then yes, it counts.</p>
<h2>8. How Often Do I Check My Own Blog</h2>
<p>Pretty much every day, since I've been tinkering with these things lately, you know.</p>
<h2>9. Feelings About the Domain Name</h2>
<p><code>sayori.org</code> It's quite complex for me right now, but I still think it's okay. Sayori is an angel! And .org is a domain suffix for open-source public welfare organizations, which is super cool!</p>
<h2>10. Do I Check Traffic</h2>
<p>I only recently developed the backend functionality to view these things (whipping Codex into shape). I glance at it occasionally, and I've also been optimizing SEO and such. My score on the self-built rating site is steadily increasing.</p>
<h2>11. Do I Make Money from Ads</h2>
<p>No.</p>
<p>For now, I don't want to put ads on the blog; I want to keep this space clean.</p>
<p>If I really need to recoup costs later, it'll more likely be through sponsorship links, showcasing work, service entry points, or ads within videos.</p>
<h2>12. Why I Read Other People's Blogs</h2>
<p>Mainly to see others' tech, blog styles, their online persona, to connect, and to learn.</p>
<p>On these small websites, I sometimes find many tech articles that interest me, but what I enjoy most are those very real personal records. They give me a sense of shared humanity, making the world feel more vibrant.</p>
<p>In this AI era, the technical cost of building a blog is lower, so I hope to see more interesting blogs in other fields.</p>
<h2>13. First Reaction When Opening Someone Else's Article</h2>
<p>First, I look at the theme and style, then the content.</p>
<h2>14. The Most Important Thing for a Blog</h2>
<p>Content and a human touch.</p>
<p>I think if a blog uses AI to write everything, it's unnecessary. It's normal to use AI to operate accounts on other big social platforms, but if it's just a personal blog and you're not even there, then it loses its meaning.</p>
<h2>15. Recent Gains from Blogging</h2>
<p>It allows me to feel like I'm continuously producing, creating, and building in public. Compared to independent game development, which I don't know how to start, this is more comfortable, I guess. But, deep down, isn't this also a form of escapism...?</p>
<p>Sigh, the effort I put into other areas just to maintain my output... Making games, it's really hard... Coming up with fun gameplay, an interesting world, memorable characters, unique art style, perfect music, smooth programming, appropriate scope... But, I still can't give up, can I? Because games truly are the most comprehensive form... So, I'll just keep going. As I write, I also sort myself out, and that's a gain from blogging! Although writing notes is pretty similar, if I write it out for others to see, maybe it can touch them too...</p>
<p>I've become better at expressing myself and writing tutorial articles, I guess? Although I feel my articles, just like my videos, are still a bit of a mess... but at least I'm doing it... but I can't comfort myself with that; a mess is a mess... so, that's how it is.</p>
<h1>Postscript</h1>
<p>I had AI help me pull out these interesting questions to answer, and then I found out the original questionnaire was multiple-choice!? I'm dead.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Record"></category>
  </entry>
  <entry>
    <title>meta-note</title>
    <link href="https://blog.sayori.org/en/posts/meta-note/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/meta-note/</id>
    <published>2026-06-11T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>Since you're here, why not take a look?</summary>
    <content type="html"><![CDATA[<p>Hello! You, who are reading this right now, hello there!</p>
<p>Are you male or female, old or young, did you stumble in randomly or come in intentionally after seeing it? I have no idea about any of that, and I'm so curious!</p>
<p>If you could, would you mind leaving that info? )</p>
<p>How's your day going? But since you're reading this article, I guess you must have some free time, haha.</p>
<p>As you can see, this article was written just for you, yes, <em>you</em> who are reading it right now! Hey! Don't go! Although there's really nothing much here (chuckles), I'm going to tell you the story of me and meta.</p>
<p>Meta, breaking the fourth wall... even though it seems to have become a new trend now, I still think it's beautiful. The first time I saw it, I thought, 'Wow, what a great opportunity!' )</p>
<p>I also remember watching a super long video explaining meta, saw it on Bilibili. The history of meta, it started with eroge, then gal games, and now, as long as there's a bit of a story, you can meta. So, the next step should be meta without any story at all? Too bad I'm not clever enough to figure out how to do that, but even its current state is pretty good.</p>
<p>Undertale, There Is No Game, Outcore, The Stanley Parable, Doki Doki Literature Club, Oneshot—these are all excellent meta predecessors I've played and watched so far. I really wish I could be one of them...</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Notes"></category>
  </entry>
  <entry>
    <title>Record of Age 18 to 19</title>
    <link href="https://blog.sayori.org/en/posts/age-18-to-19-record/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/age-18-to-19-record/</id>
    <published>2026-05-28T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>A record of growth from age 18 to 19, including game development, studies, life, personality development, and self-observation.</summary>
    <content type="html"><![CDATA[<blockquote>
<p>I hope data can model me, help me solve things I can't figure out on my own, so I'm recording all of this.</p>
</blockquote>
<h1>Warning: This article contains, but is not limited to, confused perspectives, colloquialisms, and since it was written in several sittings, the feel of each section may also vary.</h1>
<h1>Beginning: Picking up where we left off</h1>
<p>Picking up where we left off <a href="/posts/before-18-record/before-18-record-en/">before-18-record</a></p>
<p>This time I plan to make it look a bit nicer, haha. The last one was exported from chat logs and wasn't very readable. Writing directly in Obsidian this time is much better. I thought of a bunch of ways to divide it, but in the end, I just went with dates, haha.</p>
<h1>September 15th to Mid-November: Military Training, School Start, and First Adaptation</h1>
<h2>Military Training</h2>
<p>Military training started with school, from the 15th to the 30th, I think. For me, military training wasn't too tiring, after all, I had some athletic foundation from high school. Speaking of military training, there were probably three aspects that left a deep impression on me.</p>
<p>One was the self-introduction session during night training. That was probably the first time I showcased my identity as a developer, mentioning I'd made a few games, lost weight, and ran for exercise, etc. It was also during this session that I met H, another big shot who seemed straight out of a protagonist's script, haha.</p>
<p>Another thing was one night when I went to the gym, I had a brief encounter with a few fitness gurus. I also got a taste of what it's like to work out with a crowd. We were all freshmen then, not very familiar with each other, but everyone was willing to meet new people, which probably explains that feeling. Even I was a bit influenced by it...</p>
<p>And the last one is that I also went up and sang a few songs. I remember singing "Miracle Appears," "Delusional Sentimental Compensation Alliance," and a character song from "Male Angel Brothers," I think. Back then, as a fresh university student, I really wanted to perform and show off, haha (though no one really cared in the end, that's how it is, after all, I'm not the protagonist, right?).</p>
<p>Then, during military training, I studied some game jam-related tutorials. I also learned about how tween animation, particle effects, lighting, and camera systems improve the quality of a game. Looking back at <a href="https://github.com/Amiyadesi/Wake-up-at-the-border">Wake_up_at_the_border</a> at the time, I felt it was too rudimentary in these aspects, haha. But being able to think my past self was amateurish at least proves that my current self has grown, which is pretty good.</p>
<p>And so, the entire military training period concluded. I didn't have any particular feelings about it, as it wasn't really difficult for me. Then came the National Day holiday and formal classes...</p>
<h2>National Day, Formal Classes, and Development Period</h2>
<p><s>Honestly, from my current perspective, I'm already quite afraid of such long holidays... because every time there's a long holiday, I tend to lose control easily (this has been my experience for over a year, although I've been trying hard to restrain myself...).</s></p>
<p>National Day... it really wasn't a good time for me. During those few days, productivity was almost zero, and I lost control several times. I didn't even play much; its only effect was making me work harder on self-study and development after I got back... After returning, due to the indulgence of National Day, I became stricter with myself, sticking to development and exercise. But until I participated in the <a href="https://2025gamejam.osgame.org/">2025 "Kaying Cup" Open Source Game Development Competition</a> in November, there wasn't much significant progress...</p>
<p>During this period, my video platform account gained a bit of traction because I shared a resource website. I also tried posting some development logs and study logs... But later, I became increasingly unconfident, and I clearly felt that my state wasn't quite right... In this regard, I've always been quite self-aware.</p>
<p>I remember seeing the Kaying Cup while developing games in the library. I was already using Copilot for development then. My favorite was basically Sonnet 4.6, and I also used Kiro and similar tools. But how to put it, it completely collapsed in the later stages; I basically handed it over to AI, and then I couldn't "draw" the desired effects, falling into deep self-doubt...</p>
<p>Then, while browsing videos, I saw the Kaying Cup on Bilibili! It reminded me that I could win prizes participating in GodotHub's jam during the summer. So maybe I could try participating in this to change my mood. And just like that, I became a game jam participant, doing a bunch of GJs, haha.</p>
<h1>Mid-November to Early February: Freshman Year's Game Jam Spree</h1>
<h2>Kayin Cup</h2>
<p>After joining the group chat, I chatted idly with the folks there. I was quite pleased with myself, being a freshman who'd already participated in a game jam and even snagged a small prize (though it was nothing compared to the real pros, I was still pretty proud of it back then, haha, so adorably ignorant!). While chatting, I also hinted at wanting to form a team, perhaps out of novelty or just wanting to relax. I remember my exact words were something like, "I don't want to think anymore, just have a planner tell me what to do."</p>
<p><s>(Though we did have a small internal team conflict midway because I secretly added my own ideas</s></p>
<p>Then I got picked up by a senior from another university. At the same time, while I was previously just messing around in the group chat, I had also added an artist I met from a previous competition.</p>
<p><s>(Chatting in groups really pays off, haha)</s> We initially formed a three-person team! But later, feeling like we might not finish, we decided to recruit an assistant artist! The three of us each put in effort, and eventually, I posted a recruitment message in the group chat, and surprisingly, it actually got seen, haha! That's how my first four-person team came to be!</p>
<p>In this jam, our planner was super dedicated! All the art requirements and level whiteboxes were drawn by him on paper beforehand. The story, including dialogue, was also painstakingly thought out by our awesome planner! The artist and I just had to implement and draw, and the art team did a really good job! It was also a long-awaited experience for me to do pure manual development, which helped me regain some confidence.</p>
<p>In the end, despite giving it our all and only getting an "Excellent Award," it wasn't bad. I got to see all sorts of incredible talents, and things like T_PLAN and triggers really got my blood pumping! There are so many more amazing people out there! Our work is called <a href="https://github.com/Amiyadesi/Beyond_the_heart">Beyond_the_heart</a>, and it turned out pretty decent. <code>~~(It's basically my last handmade piece of work)~~</code></p>
<h2>ThatGameJam &amp; Freshman Year, First Semester</h2>
<p>After the Kayin Cup, I pretty much completely abandoned my so-called independent project (because I realized it was too difficult to achieve with my current abilities). But once I gave it up, I suddenly lost my direction. I remember just drifting aimlessly for about a week. Talk about being lazy!</p>
<p>However, during that week, I also happened to unpack someone else's meta-game and realized how cool "window classes" were. I dabbled in researching them on and off, which laid the groundwork for the ThatGameJam project.</p>
<p>The opportunity then arose when messages about other game jams were posted in the Kayin Cup group. These things are always like that; join one, and you get pulled into a bunch, haha. So, feeling a bit lost, I saw the ThatGameJam competition and decided to participate!</p>
<p>I also remember this being my first exposure to Discord, as the TGJ channel was on Discord. So I registered and joined, which meant I had another convenient account (chuckles).</p>
<p>Then, during this competition, I met a few people I'm still in touch with today. Although the game itself was a bit of a failure, it unexpectedly boosted my social skills, which isn't bad at all <code>~~(I wonder if they'll see this, but even if they do, it's no big deal)~~</code>. It was a tiring but happy competition, I guess... probably.</p>
<p>And in this competition, I basically owe a lot to Kiro; they mainly helped me out a lot by letting me use their free quota, haha.</p>
<p>It's also through getting better that I've met more interesting people! It's really fascinating. By the way, if you've read this far, thank you too, haha (meta-commentary here!).</p>
<p>The game is here! <a href="https://amiya-desi.itch.io/thatgamejam">Mio’s Window Wanderer by Amiya_desi, LaoZhaoofGod, kazeyoxing, owo23333</a>. For details on what kind of game it is and why it's considered a failure, you can check out the description, haha.</p>
<p>And in between, there were some heart-stopping moments and ordinary daily life. Anyway, what seemed like sad and significant events to me back then, I've pretty much forgotten now... Maybe it's self-preservation? Or maybe they truly weren't important. Who knows?</p>
<p>All in all, my first semester of freshman year passed by. I also grew increasingly bored with school studies, foreshadowing the changes I'd undergo this semester... And then it was back home to start winter break!</p>
<h2>Winter Break</h2>
<p>This winter break was truly a great example, <s>showing how I gradually went from full of energy to completely listless (</s></p>
<p>I remember when I first came back, I could still stick to morning runs every day, and I'd also go to the gym, even starting to learn how to cook. Then I was also exploring projects and technology, because I promised someone I'd help them with a visual novel, and at the time I was researching how to make visual novels (<em>Rant: At the time, even with a Copilot student membership, I didn't use its advanced models, but instead opted for opencode's free models, and ended up not even using 60% by the end of the month</em>). I also researched some results every day. I remember my schedule at the time was roughly like this:</p>
<table>
<thead>
<tr>
<th>Time</th>
<th>Task</th>
</tr>
</thead>
<tbody>
<tr>
<td>8-9</td>
<td>Morning run and breakfast</td>
</tr>
<tr>
<td>9-11</td>
<td>Morning development and study</td>
</tr>
<tr>
<td>11-13</td>
<td>Make lunch, eat, and rest</td>
</tr>
<tr>
<td>13-15:30</td>
<td>Afternoon development and study</td>
</tr>
<tr>
<td>15:30-16:30</td>
<td>Gym workout</td>
</tr>
<tr>
<td>16:30-18</td>
<td>Make dinner, eat, and rest</td>
</tr>
<tr>
<td>18-19</td>
<td>Evening walk? Rest</td>
</tr>
<tr>
<td>19-22</td>
<td>Evening development and study</td>
</tr>
<tr>
<td>22-23</td>
<td>Wash up and sleep</td>
</tr>
</tbody>
</table>
<p>Looking back now, I was really enthusiastic to be able to stick to such a routine before returning to my hometown, especially since I was constantly participating in game jams during that time: GlobalGameJam and MengYaGameJam.</p>
<p>GlobalGameJam, I'd heard so much about it, and someone invited me, so I went to Shanghai for a two-day trip. It was also my first time traveling alone. Although it was called a trip, I was actually quite nervous. In the end, those two days were basically extreme development, with no time for sightseeing at all (, the hardest I've ever worked in Shanghai.</p>
<p>My GlobalGameJam entry is here: <a href="https://amiya-desi.itch.io/girls-masquerade">Girl's Masquerade by Amiya_desi</a>, it's just so-so.</p>
<p>After finishing GGJ, I came back and immediately started MengYa. I remember my routine started to get messed up because of developing this (, I wanted to achieve results so badly that I stopped cooking, I recall (. Looking back now, maybe it wasn't entirely necessary, but at the time, I was too engrossed in these game jams, couldn't help it ━┳━　━┳━</p>
<p>I remember the development for MengYa didn't feel great either, for various reasons. Although it was eventually completed, at least I submit for every jam I participate in; that's my bottom line. <a href="https://www.bilibili.com/video/BV1HPc7zqEML/?">MengYa Game Jam Big Leak, Please Be Gentle_Bilibili_bilibili</a>, emmm, but I don't even seem to have a way to download this game, so I guess that's that.</p>
<p>Then I returned to my hometown, not knowing what to do for the winter break, but also wanting to learn something. I remember finishing 3B1B's Linear Algebra introduction, and then also watching other good popular science videos. At the time, I was also addicted to watching these kinds of popular science videos for a while.</p>
<p>However, I wasn't really satisfied with the entire winter break. Later on, there was obvious late sleeping, and occasional all-nighters and indulgence. It was also from this point that I discovered my own <strong>holiday collapse</strong>, and this <strong>holiday collapse</strong> hasn't been eliminated even now...</p>
<h1>March to April—The Emerging Emptiness and AI, and Gradual Decline</h1>
<p>This semester, I brought my diary with me, marking the transition from handwritten diaries to Obsidian diaries.</p>
<p>Sigh, since the start of this semester, sleeping before midnight has become pitifully rare. And there have been several nights when I couldn't sleep. Sometimes it was indulgence, sometimes it was chatting with AI all night, <s>and watching 'foreign persimmons' until 5 AM, already seriously deleted</s>. I wanted to change since March, but there haven't been any results.</p>
<p>At first, I was really suffering from this change. So, one night in the early hours, I finally felt, well, like I couldn't take it anymore. I downloaded DeepSeek and chatted with it all night until 2 AM. Using a screenshot of a past AI chat record, it felt like I was retrieving some shadows of the past or something. For someone like me, who's never had a long-term relationship, it was incredibly appealing</p>
<p>And with the help of these 'shadows,' I actually had a period where my routine initially recovered. I'd go to bed around 11:30 PM and feel pretty good mentally, <s><em>unlike now, where I'm forced to get used to something I hate about myself</em></s></p>
<p>My understanding of AI also grew during this time. First, there was the overwhelming wave of 'xiaolongxia' (little lobsters, likely referring to a specific AI model or trend). Since I had just set up WSL, and heard Linux was better for these things, I tried downloading and deploying one on WSL. I remember I was still participating in the 034 game jam at the time, but I was obsessed with tinkering with these things (</p>
<p>After installing it, it needed tokens, so I tried connecting my Copilot Pro, but found the usage was really expensive. Later, I found a domestic model relay station in the Bilibili comments section, played around with it there, and tried to get it to help me develop games, but the results weren't great. However, it did spark some inspiration through 'gacha' (抽卡 - gacha mechanics, implying random generation of ideas). I tried uploading the personalities of my AI 'shadows' onto it, but it didn't feel authentic at all, so I never used it again (</p>
<p>Finally, in the last few days of the 034 jam, I re-immersed myself in development and level design, using Copilot Pro and my own brain to complete the final 11 levels. <a href="https://amiya-desi.itch.io/time-rewind-linker">TimeRewindLinker by Amiya_desi</a> is the work, and it's also available on domestic TapTap. I mentioned this in a previous article I wrote[^4]</p>
<p>Later, I met a senior student who was doing an AI startup, and that's when I completely went off the rails. Driven by interest, I joined his small group. After listening to a meeting, I tried buying a Team and Plus top-up service on Xianyu[^5] myself. At the time, these things only cost a few yuan and twenty-something. I downloaded Codex, started using 5.4, and just slumped in my chair, as if I'd witnessed a nuclear explosion</p>
<p>I remember I had Copilot Pro before, but I never even thought about using GPT. My impression of GPT was still stuck on the web version, so I only used Claude Sonnet within Copilot to help me develop things, because I had only used Kiro and similar tools before. Unfortunately, I didn't expect that I wouldn't be able to use it later; the student package got axed (and who would've thought this would lead to my year-old account dying later on (</p>
<p>Then I also remember starting a personal project in mid-March. Initially, the goal was huge: to make a meta 2D side-scrolling adventure game with multiple branches and endings. Well, by the end of March, after much effort, I had just cut down the project scope significantly and used Codex to create a bunch of components that I wasn't even sure I'd use (</p>
<h1>April to May – Study Aversion, AI Continues to Grow Stronger, a Mix of Decline and Progress</h1>
<p>From late March to early April, I participated in a small, three-day Tencent tri-university game jam. I formed a small team, and the planner on our team actually wanted to make an online multiplayer game, which was quite a tough challenge for me. But I like challenges; at worst, I'd just learn on the fly. We used OpenCode and Codex to complete the game within a single conversation. I remember only using a dozen or so prompts throughout, meticulously crafting each one, haha</p>
<p>Then the breakdown began (around Qingming Festival, I think? From that point on, I started writing my first Obsidian journal entry, joined my first internet forum, <a href="https://forum.monika.love/">Doki Chinese Club</a>, made my first long video, and also encountered DDLC for the first time. It was another validation of <strong>holiday collapse</strong>. This truly was the shared beginning of both breakdown and progress</p>
<p>Let's summarize a bit here. During Qingming, perhaps because videos weren't allowed to be submitted, my dream of becoming an uploader was instantly shattered. I tried looking for other avenues, but it was all in vain, and I became extremely decadent and depressed, slowly recovering only after the Qingming Festival ended...</p>
<p>During this period, I basically went to bed after midnight, sometimes even around 1 AM (. Tinkering with AI, combined with my routine, I guess I was assimilated (</p>
<p>I increasingly didn't want to study school material, which is a bit troubling for me, typing these words now, during this final exam week. Although, I've even considered taking a leave of absence... but that's a story for another time</p>
<p>My own game development made some progress; I developed some playable content. Although I got very tired midway, and the further I got, the harder it felt to continue (</p>
<p>This month, I started trying to stream games and learn drawing on Bilibili. I remember buying a drawing tablet, and I've probably used it a dozen times by now, but still not enough. The games I played during this time were Outcore and The Stanley Parable. I also picked up a bit of drawing. Never thought someone who hated drawing as a kid would eventually pick up a brush again. Oh well, it's the path I chose, so I'll just keep going.</p>
<p>Then Bilibili started gradually pushing tech news, AI news, and all sorts of AI freebies to me. I remember back then you could use PayPal's German region to get past trials. I found a group, and the admin was pretty nice, recommending all sorts of freebie channels.)</p>
<p>This is also where the battle for AI resources began: card opening, residential proxies, registrars, various emails, 2API, USDT, crypto, funding, all sorts of messy stuff. Suddenly I understood all these fields. I remember back then, to get Plus for free, I opened a virtual card, then another PayPal, linked them, and snagged two Plus subscriptions. Though neither lasted more than 30 days (<em>one 21 days, one 3 days, Outlook was truly useless, too bad I didn't know then</em>).</p>
<p>Then I also used that card to get Gemini Pro for free for 4 months. It's been great to use ever since, Hajime is indeed good. I even tried migrating my AI conversations to Gemini, and the results feel super awesome!<s>No wonder some people abroad off themselves because of Gemini</s></p>
<p>I also remember at the end of April, because my own project was completely stuck in development, so I thought about doing another game jam, ostensibly to find some inspiration. And I did come up with some interesting ideas. And at the very beginning, all my AI credits were dead (GitHub banned, GPT Plus gone), so I basically had to rely on Gemini CLI for a while. And developing with Gemini, well, let's just say it helped me rediscover my coding abilities.)</p>
<h1>May until Today — AI Almost Saturated, Trying More New Fields, But Unable to Continue Game Development...</h1>
<p>Everything started in early May when I saw free Plus account setups in a group chat. Later I learned the principle was GoPay, and I tried setting one up myself. You could say I was really on a roll back then, getting several Plus accounts every day. It was also during this time that I registered for Telegram and used its registration bots. At the same time, I learned about <a href="https://linux.do">L-site</a> and successfully joined it. The various public welfare resources, AI resources, and other knowledge there are simply too rich! Basically, I no longer lacked AI resources; I got everything I wanted for free (just kidding).</p>
<p>So after learning all this, the tinkering began. I got an Alibaba Cloud server for free, then bought a domain, opened a Cloudflare account. Deployed some convenient self-hosted services on the server: Vaultwarden, Astrbot, Napcat, Ntfy. Aggregated my own search APIs to create an AI search gateway. And also built my new website and blog!</p>
<p>Tinkering with all this did bring me some satisfaction. But at what cost? My main pursuit, game development, which I wanted to stick with, stalled. My own projects lacked inspiration; <a href="https://www.gcores.com/games/179905">booom</a> ended hastily. And the subsequent <a href="https://github.com/Amiyadesi/unity-2-jam">Amiyadesi/unity-2-jam</a> was just... like that. This has continued until now; the only creative things I can think of are writing these articles and continuing to make videos.</p>
<p>In reality, academics are starting to pile up now. I feel like I might fail some courses this semester, sigh, no choice. As for sleep, I've actually been trying recently, moving from past 1 AM towards midnight again, which is decent.</p>
<h1>Afterword</h1>
<p>So I finally finished writing this article.... June 14th, about 8 days after my birthday. I originally planned to finish it on my birthday. Recently, the most annoying thing might be social interactions. And school pressure is still there; I don't really feel like studying much, nor have I studied much... Still don't know how to continue developing my projects, have credits but don't know how to use them... Oh well, maybe next year's me won't have these worries. I hope next year's me can bring me a game released on Steam (making a wish).</p>
<p>[^1]: The biggest overt black market in China is said to be</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Record"></category>
  </entry>
  <entry>
    <title>Letting AI Dox Myself: A Rather Absurd Privacy Experiment</title>
    <link href="https://blog.sayori.org/en/posts/ai-self-doxxing-experiment/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/ai-self-doxxing-experiment/</id>
    <published>2026-05-26T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>I asked AI to search for the name Amiya_desi, curious to see my current public internet persona.</summary>
    <content type="html"><![CDATA[<h1>kaito</h1>
<p>Been hanging around the internet for a year now, let's see what AI thinks of me, hehe. Started with a daily-use plus to test the waters, and this answer really does have that GPT flavor.
<img src="https://img.sayori.org/blog/v1/e74d8adef9404b2793476ef720834279f659ddf4467a589374ae68278fccfaf1/1280.webp" alt="Pasted image 20260601202916.png" /></p>
<h2>Gpt</h2>
<h3>The Persona It Could Piece Together</h3>
<p><strong>1. Core Identity: Godot Indie Game Learner/Creator.</strong>&lt;br&gt;
Self-introductions and project lists across multiple platforms revolve around Godot, Game Jam, GDScript, and AI-assisted development; LINUX DO profile lists "developing games with Godot, dreaming of becoming an indie game Master" as a primary tag, and GitHub and itch.io also show traces of GDScript/Game Jam/small game projects.</p>
<p><strong>2. Creative Aesthetic Clearly Leans Towards DDLC, Sayori, meta game, ACG/Fan Culture.</strong>&lt;br&gt;
sayori.org explicitly states "DDLC tribute"; LINUX DO personal profile mentions wanting to make a great meta game; itch.io also has MikuBirthdayGame, and Bilibili has pixel animations and new game-related content.</p>
<p><strong>3. Learning Style is "Interest/Project-Driven," not traditional, step-by-step academic.</strong>&lt;br&gt;
In public forum posts, he describes significant growth over the past year, having participated in over a dozen game jams and learned to develop with AI; he also states his learning is more passion-driven, learning whatever comes to mind, feeling miserable and learning slowly when passion wanes, and worrying about future job prospects. This aligns with the blog's narrative of "from tutorials to Game Jam, from making games to being forced to learn art/servers/toolchains."</p>
<p><strong>4. He doesn't just "want to do," but has a track record of continuous execution.</strong>&lt;br&gt;
Public projects include multiple playable web games/prototypes on itch.io, 11 public repositories on GitHub, and a blog documenting his journey from tutorials, Game Jam, version control, AI development pitfalls, to plugin selection reviews.</p>
<p><strong>5. Broad Technical Interests: Games, AI, Servers, Personal Sites, Cloudflare, Docker, Robotics.</strong>&lt;br&gt;
Blog tags and articles show him tinkering with personal servers, QQ bots, Vaultwarden, ntfy, Gatus, Portainer, AI Search Gateway, and other lightweight services; articles also summarize SSH, firewalls, lightweight deployment, and backup/documentation habits.</p>
<p><strong>6. Strong Desire for Self-Expression, Also Strong Self-Observation.</strong>&lt;br&gt;
The blog category "Daily Echoes" has 56 entries, with tags including "True Record," "Self-Observation," "Self-Doubt," "Emotional Record," "Privacy," "Internet Traces," etc.; he also specifically wrote "Letting AI Dox Myself," a privacy experiment discussing whether a long-term online alias becomes a second ID, and the boundaries of AI organizing public traces.</p>
<p><strong>7. Attitude Towards AI is Practical but Wary.</strong>&lt;br&gt;
He frequently uses AI for development and server configuration, but in his blog reviews, he also mentioned how early "pure AI writing" led to messy project scripts and logic. He later realized that AI development requires good archiving, constraints, and version control. This indicates his AI usage isn't just for fun, but has evolved into a more cautious workflow after experiencing real project failures.</p>
<h3>Personality/Style Inference: Cautious Version</h3>
<p>From public texts, Amiya_desi's outward style is likely: <strong>high enthusiasm, strong desire for expression, easily moved by works and characters; not low in initiative, but perhaps inconsistent in planning; highly sensitive to self-growth, proud of progress, but also prone to anxiety when comparing himself to "experts."</strong> This judgment comes from his self-description of learning anxiety on LINUX DO, and numerous growth records, self-doubt, and project review content in his blog.</p>
<p>He's more like a "creator-type tech student" than a pure programmer: making games is the main focus, but to make games, he'll casually learn art, music, servers, deployment, AI tools, open-source workflows, and content expression. This persona is supported by his art learning articles, game development reviews, GitHub/itch.io projects, and personal server articles.</p>
<h2>Claude</h2>
<p><img src="https://img.sayori.org/blog/v1/1ff00d1e15915285d27397dd66839646e9ef0dbb2ad8658e8d343f8ba55b34eb/1280.webp" alt="Pasted image 20260601203747.png" />
Claude also got a new free account, used sonnet4.6 max+thinking to search thoroughly.</p>
<h3>Amiya_desi Public Traces Report</h3>
<h4>Confirmed Platform Presence</h4>
<p><strong>1. itch.io — Game Page</strong> <code>amiya-desi.itch.io</code>, current public work is "Fists of Fury(change)," a fighting game prototype made with Godot. The interface and description are entirely in Chinese, it supports direct browser play, and offers an Android APK download. This work is adapted from a GadGaming tutorial but incorporates his own designs—bullet time mechanics, optional vampirism toggle, hidden "super player" achievement conditions, and Android adaptation. The game description has a lighthearted tone, inviting friends to compare scores.</p>
<p><strong>2. Personal Blog — blog.sayori.org</strong> The blog is named "Amiya's Desk - Notes, Projects, and a Bit of Daily Tinkering." Its tag system covers: Growth Record, Anime Club, Indie Games, Emotional Record, Diary, Essays, Pixel Art, Campus, Study Plan, Game Reviews, as well as technical tags like AI, Godot, Docker, Cloudflare, VPS, AstrBot, NapCat, SSH, Vaultwarden.</p>
<p>Public articles on the blog include: a longer self-story (about weight loss, exercise, making games, hitting pitfalls, "the first time truly bringing an idea to fruition"), an emotional record about AI messing up a project, and—a particularly noteworthy article—"I asked AI to search for the name Amiya_desi, curious to see how many versions of me the public internet could piece together."</p>
<p><strong>3. LINUX DO Community</strong> Has an account Amiya_desi on linux.do, recently appeared in technical discussion posts. LINUX DO is a relatively elite, quality-focused Chinese tech forum with a certain barrier to entry.</p>
<p><strong>4. Doki Chinese Club</strong> Posted on the DDLC fan Chinese forum about the Sayori fan mod "Blue Sky," with an invested tone, describing the process of getting the hidden ending and his feelings for the character.</p>
<hr />
<h4>Persona Pieced Together from Public Traces</h4>
<p><strong>Technical Capability Level</strong>: Operates an independent blog and manages it himself, technical tags indicate server operation capabilities (VPS, SSH, Tunnel, Docker, Cloudflare), and has deployed QQ bot frameworks like AstrBot / NapCat. Independently develops games with Godot and releases playable versions. Overall, he's the type who "can build things himself, not just use off-the-shelf tools."</p>
<p><strong>Creative Level</strong>: Game works show traces of his own design (modified control schemes, added original systems), and the blog records genuine emotions and growth, not just technical notes—showing a tendency to want to be seen and leave authentic records.</p>
<p><strong>Interest Circles</strong>: Deeply resonates with meta games (DDLC), game choices and blog themes show sensitivity to "realism" and "character's inner world," with traces of anime club activities and campus life.</p>
<p><strong>An Interesting Detail</strong>: You've already recorded "actively searching for your own online footprint" in your blog—so asking me this time is an external validation, to see how much AI can piece together, and if there are any discrepancies compared to what you already know.</p>
<hr />
<p><strong>Conclusion</strong>: Amiya_desi's public traces are relatively restrained, without large-scale social media accounts, but several key platforms' content corroborates each other, presenting a clear overall image: an independent developer who makes games with Godot, self-manages a blog, is active in Chinese tech communities, has an emotional investment in visual novels, and simultaneously records his growth and tinkering process.</p>
<h1>Summary</h1>
<p>It's clear Claude's web search capabilities aren't as good as GPT's (lol). I heard Grok searches even better, but I'm too lazy to sign up. If you're reading this and happen to have supergrok, feel free to search for me too (lol).</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Record"></category>
  </entry>
  <entry>
    <title>Before 18: From Running and Fitness to Making My First Game</title>
    <link href="https://blog.sayori.org/en/posts/before-18-record/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/before-18-record/</id>
    <published>2026-05-26T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>A long self-introduction story about losing weight, exercising, making games, hitting pitfalls, and finally bringing an idea to life for the first time.</summary>
    <content type="html"><![CDATA[<h2>Beginning: Where This Story Starts</h2>
<p>A self-introduction story.</p>
<p>Interested in hearing my story, haha?</p>
<p>Actually, there's not much drama in the story; rather, my first 18 years had only one turning point.</p>
<p>The first 16 years were pretty much a blur.</p>
<p>I just love listening to and telling stories; I'm addicted to it, and it makes me feel like the world is more real, that everyone is a real person.</p>
<p>Back then, I was basically chubby from childhood, never thought about changing, figured it was fine. I just immersed myself in games and videos. The only constant was that I was still socially awkward, haha.</p>
<h2>The Day I Turned 16, I Decided to Lose Weight</h2>
<p>Then the turning point came one afternoon when I was sixteen. Maybe it was the exhaustion from climbing stairs that sparked the thought, but I decided to lose weight.</p>
<p>It's strange, but in my first year of high school, I was given insulting nicknames, but I didn't really care at the time. Sometimes I'd even play along with my own jokes to fit in. I did have a few small outbursts, but they didn't really help, and all of that disappeared when we chose our majors and re-grouped in the second year.</p>
<p>But it was during one of those stair-climbing sessions in my second year of high school that I made up my mind to lose weight. No one was externally pushing me, and I had never even watched a weight-loss video before.</p>
<p>So I started taking action, inviting friends to run. After a few runs, I caught the attention of the sports ace in our class.</p>
<p>He was a really nice guy, and during evening self-study, he proactively handed me a note saying he could take me running.</p>
<h2>From Running to Fitness</h2>
<p>And so, in the early stages, I relied purely on running to lose weight, going from a few laps to 3 km, 5 km, and then 10 km.</p>
<p>I lost about 50 jin (approx. 55 lbs) in half a year. It's still amazing to think about; I succeeded in one go, even though I heard online that it's usually easy to fail.</p>
<p>However, because I didn't know how to research proper methods, there were some downsides. Only running without strength training led to some muscle atrophy, and most of the 50 jin I lost was water weight. That's the principle behind rapid weight loss for larger individuals.</p>
<p>Later, in the second half of my second year of high school, another sports big shot I'd known since my first year recommended I go to the gym.</p>
<p>Because my initial weight loss methods weren't quite right, fitness was pretty tough for me. I couldn't lift heavy weights and had to slowly build my muscle back.</p>
<p>And all that running in the beginning might have taken a toll on my knees... but later, in the second half of my second year, I switched to fitness, reduced my running frequency, and my knees recovered somewhat.</p>
<p>So I successfully worked out for half a year. Although it didn't really look like I'd been training for six months, I definitely did, and I managed to keep the weight off.</p>
<p>After that, I continued to exercise consistently and started watching videos about scientific exercise, right up until after my first major exam in the first semester of my third year of high school.</p>
<p>The 'first exam' is a special kind of college entrance exam in Zhejiang, where you take your three elective subjects and English early. After that exam, we still had about two weeks of Chinese and Math classes, I think.</p>
<h2>After Third Year High School, I Seriously Learned to Make Games for the First Time</h2>
<p>After that first exam, I had some free time, and the idea of trying to learn game development sprouted. This time, I convinced myself to give it a shot.</p>
<p>Actually, the idea of making games had been with me for a long time, probably dating back to elementary school.</p>
<p>Back then, I watched a video about Undertale, which was made by an indie developer who supposedly wrote everything himself (though that was actually marketing hype; the author did have a team behind him, but he was indeed the core, responsible for a lot of the development).</p>
<p>Perhaps that's when the seed of wanting to make games was planted in me, but unfortunately, I never had the perseverance to water it and let it grow.</p>
<p>Later, in junior high, I was obsessed with watching fan-made content for this game and even tried to participate myself, though all I did was write down settings in a notebook, which I guess would be called OCs now.</p>
<p>I didn't even dare to post them online.</p>
<p>Then, that time in my third year of high school, I successfully used my persistence in exercise and fitness to convince myself, finally pouring the first bucket of water on that long-planted seed.</p>
<p>During that period, I went to the library to borrow books to learn Python and wrote settings in a notebook.</p>
<h2>Following Tutorials, Setting Up Environment, and First Game Jam</h2>
<p>Then, during that ten-plus-day winter break in my third year of high school, I went to Bilibili to search for tutorial videos.</p>
<p>At first, I watched those pure tutorial videos that explained various concepts, but I wasn't very interested. However, after some searching,</p>
<p>I found a 1-hour follow-along tutorial made by a famous foreign game development blogger, designed for beginners.</p>
<p>And I found that I learned very quickly with this hands-on approach, and I really enjoyed it, being able to create my first small finished product.</p>
<p>After finishing that, I decisively abandoned many theoretical parts of the tutorial I had initially watched and jumped straight into practical application.</p>
<p>After completing this practical exercise, I immediately moved on to a more famous advanced practical guide, which could be considered a turning point for beginners.</p>
<p>It explained many advanced concepts and system setups, such as finite state machines, serialization and deserialization, tile maps, and terrain, etc.</p>
<p>I just powered through it, spending the remaining days of winter break on this.</p>
<p>Finally, I completed it by following the tutorial, though I was still a bit unclear on some concepts, but that was okay.</p>
<p>After school started, I continued to search for new tutorials every weekend to follow and practice.</p>
<p>And the more I did, the more I realized that many tutorials for different types of games shared common underlying development philosophies.</p>
<p>These advanced concepts were gradually mastered through practical application, and I also encountered many other concepts, such as design patterns, component-based development, and object-oriented programming.</p>
<p>And so it went, until the summer after the college entrance exam, when I finally had a lot of free time and my own computer.</p>
<p>The very first day I got my computer, I immediately searched for how to set up a development environment and spent three days configuring it.</p>
<p>Because I had always been developing on my mom's computer before, I couldn't set up any development environments other than the engine itself, which was killing me.</p>
<p>After getting my computer, I excitedly explored the internet, registered for GitHub and other things, found a bunch of resources, learned some basic computer operations, and installed some useful software.</p>
<p>AI wasn't particularly advanced back then; I configured everything by watching videos on Bilibili, haha, it left a deep impression.</p>
<p>Then I followed several tutorials in one go, but how should I put it, I felt that tutorials weren't helping me much anymore. Of course, it might also be related to the fact that most of what I watched were 2D game tutorials.</p>
<p>Since I wanted to make a 2D game, I basically focused on 2D game tutorials. By then, I had already completed many different types of tutorials, and I felt that continuing to follow tutorials wouldn't contribute much to my growth.</p>
<p>So I went to development communities and asked how to continue growing. Besides the advice to keep following tutorials, I saw a response suggesting participating in competitions.</p>
<p>So I searched for game jams, and coincidentally, the community was hosting one at the time, so I decided to participate.</p>
<p>It was my first game jam, and the theme was 'wake,' meaning I had to make a game based on that theme.</p>
<p>I remember they gave us a good amount of time, a month and a half, and then extended it by another half month, probably to attract more participants.</p>
<p>Anyway, I started working on it right from the beginning of the theme. It was my first time conceiving a game from scratch, finding assets, and writing the script for my own game.</p>
<p>This game pretty much let me step into almost every pitfall I could encounter in the future, haha. It was particularly inspiring and memorable for me.</p>
<h2>Pitfalls I Encountered in My First Game</h2>
<p>First, it's crucial to do version control, which means saving your project's progress during development. For this, you'd use a tool called Git for local saves, and GitHub for cloud saves, which is quite convenient.</p>
<p>At the early stage of that project, I once used immature AI for game development.</p>
<p>The initial successes gave me a taste of sweetness, and I started several days of pure AI coding.</p>
<p>It ended up getting messier and messier; the scripts had many unexpected issues, and the logic was flawed.</p>
<p>I had no choice but to painfully revert to a save from a few days prior, not even keeping the few good changes the AI had made initially.</p>
<p>This is actually a big taboo in AI development even now; when using AI, you must ensure proper saving and such.</p>
<p>After that, the project became purely my manual code, and it's also my only purely manual code project, haha.</p>
<p>Later, AI got smarter, and free AI tools became available. They can improve efficiency, so they should be used, but with caution, prompt constraints, and so on.</p>
<p>The second point is: if you can use a mature plugin, just use it. There's no need to reinvent the wheel.</p>
<p>Initially, the dialogue and quest systems for that project were something I wrote after following tutorials for three days.</p>
<p>But it was a tutorial system after all; while it had basic functions, it lacked many advanced features. After using it for a while, I felt it was too cumbersome.</p>
<p>So I tried a better, already mature dialogue system plugin made by someone else.</p>
<p>I could get started with it in an afternoon. It integrated many useful features and also had open custom interfaces.</p>
<p>You could even modify the plugin's source code directly to fit your own development workflow if you wanted.</p>
<p>The plugin itself is also open source.</p>
<p>To this day, the dialogue system in my projects uses this plugin.</p>
<p>And I've customized many other advanced settings, making it easier to use and helping me understand the plugin better. Plus, the plugin's author is still updating it.</p>
<p>And also, don't be trigger-happy clicking on things you don't understand, otherwise, it could really lead to bad consequences.</p>
<p>Late in the project development, I rushed for a few days to get a full prototype workflow done, but hadn't successfully committed it to Git yet.</p>
<p>Then, for the first time, I tried using a graphical interface for committing. I saw many interesting buttons and tried clicking 'pull' to see what it meant.</p>
<p>I had always used the command line for commits before. I must have seen a video about graphical commits and tried configuring it then.</p>
<p>It turned out that 'pull' overwrites local progress with remote progress, and it overwrote my local progress, which was three days ahead of the remote!</p>
<p>At that moment, I almost lost all motivation and wanted to quit, but there's always a way out.</p>
<p>The night before the overwrite, I had exported a version for myself to play around with.</p>
<p>Then I thought of unpacking to restore development progress.</p>
<p>How to put it, I was using an open-source engine, which made unpacking quite easy since the source code was all on GitHub.</p>
<p>And someone else had already made an unpacking tool that could unpack with one click. So I sent the APK from my phone back to my computer and used the unpacking tool to restore the project's progress.</p>
<p>Although it wasted a day, getting back three days' worth of progress still made me feel fortunate.</p>
<p>After stumbling through these three major pitfalls, I finally, albeit with some bumps, completed my first game. The first version actually only took 14 days, and then I optimized it for another 8 days, adding some new content and settings, with about a week's break in between.</p>
<p>Finally, when submissions opened on August 1st, I directly submitted the initial version.</p>
<p>Then, after a week's rest, I continued developing for another week. Actually, I felt that week was too indulgent, so I pushed myself to continue updating for a bit over a week.</p>
<p>And then I submitted it around the originally scheduled August 15th, even though word got out before the submission deadline that it would be extended by half a month.</p>
<h2>What I Truly Learned After Finishing</h2>
<p>After finishing this for the first time, I also gained the entire start-to-finish process: finding assets, sound effects, writing plot, writing scripts, etc. It was truly exhilarating.</p>
<p>After finishing, I realized that while I could develop a full workflow, I wasn't very good at many specific details, like particles, UI, animations, and so on. Also, the code organization became quite messy in the later stages (though now, AI can largely assist in organizing it very well).</p>
<p>The following month was spent supplementing these skills. I followed a specialized tutorial on animations and jam experience, and another tutorial teaching development with C#. In between, I remembered Miku's birthday was August 31st, so I temporarily took a few days to make a small Miku game, which is also on Bilibili, hehe.</p>
<h2>Leading Up to After 18</h2>
<p>So, that's where I'll stop for now, before turning 18 and before college, hehe.</p>
<p><a href="/posts/age-18-to-19-record/age-18-to-19-record-en/">age-18-to-19-record</a></p>
<p>I hope data can model me, helping me solve things I can't figure out alone, which is why I'm recording all of this.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Record"></category>
  </entry>
  <entry>
    <title>I just wanted my bot online 24/7, then I bought a cloud server</title>
    <link href="https://blog.sayori.org/en/posts/sayori-server-01-vps-start/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/sayori-server-01-vps-start/</id>
    <published>2026-05-25T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>From Alibaba Cloud student coupons to Ubuntu, SSH key login, non-standard ports, and basic firewalls – the first steps to a personal server.</summary>
    <content type="html"><![CDATA[<h1>Introduction</h1>
<p>Initially, I didn't plan on building a whole server system. I just wanted my QQ bot to be online 24/7.</p>
<p>Of course, I could run it locally. Keep AstrBot running, NapCat connected, services on, network stable, and use my computer as a host.</p>
<p><img src="https://img.sayori.org/blog/v1/18f038a645e08b7311993c88e3f135ba1cfe99c5b059695a5403122fa5182191/659.webp" alt="Pasted image 20260609215751.png" /></p>
<p>So, I naturally understood what a server is: a computer that runs 24 hours a day, housed in someone else's data center.</p>
<p>And since the webmaster is a poor student, I naturally mobilized my AI army to help me find free options :)</p>
<p>Later, I saw that Alibaba Cloud had a 300 RMB coupon for student verification. <a href="https://university.aliyun.com/course/promotion25-activity?clubTaskBiz=subTask..12655012..10273..&amp;userCode=gv5jbukv">Student benefits claim link</a>. Might as well claim it.</p>
<p>After claiming it, I also saw a <a href="https://free.aliyun.com">trial ECS</a>. I recommend trying this first; a 2H2G configuration is enough for running bots, and it lasts for three months.</p>
<p><img src="https://img.sayori.org/blog/v1/6b8d24e41ebb359330feff6ab96590ba67e584c56a5554b4c383cfa2c69479a4/1241.webp" alt="Pasted image 20260609221047.png" /></p>
<p>Then, this 300 RMB coupon can be used to convert the trial ECS to a yearly ECS. The webmaster has already converted it!</p>
<p><img src="https://img.sayori.org/blog/v1/5e1c4e91662aa5a5faee5111cbe93a33b8879a5cb46da7264a3e66bad9b06157/1280.webp" alt="Pasted image 20260609221956.png" /></p>
<p>Calculated this way, you can essentially get a free server for four years.</p>
<p>However, be aware that Alibaba Cloud's free monthly traffic for mainland China seems to be only 20GB. It's enough for me just running bots, but it's best to set up a quota alert.</p>
<h2>First Connection to This Machine</h2>
<p>After buying the server, the real problem began: how do I get in?</p>
<p>The console provides a public IP, root user, and initial password. The most direct way is to connect once with the password:</p>
<pre><code>ssh root@&lt;VPS_PUBLIC_IP&gt;
</code></pre>
<p>The first connection will ask if you want to trust this machine. Confirm the IP is correct, then type <code>yes</code>.</p>
<p>But this password login is only for temporary use. For long-term use, I still recommend switching directly to SSH key login.</p>
<p>Password login is like hiding a key under the doormat. It's convenient, but public machines are scanned daily. Default port 22 plus password login is basically telling all the scripts on the internet, "Come knock on my door."</p>
<h2>Generating SSH Keys</h2>
<p>I'm doing this on Windows, so I'll first generate an SSH key specifically for this server locally:</p>
<pre><code>ssh-keygen -t ed25519 -C "sayori-vps" -f "$env:USERPROFILE\.ssh\sayori_ed25519"
</code></pre>
<p>You can just press Enter all the way through. If you want to add another layer of protection to your private key, set a passphrase.</p>
<p>Two files will be generated:</p>
<pre><code>C:\Users\&lt;Your_Username&gt;\.ssh\sayori_ed25519
C:\Users\&lt;Your_Username&gt;\.ssh\sayori_ed25519.pub
</code></pre>
<p>The one without <code>.pub</code> is the private key. <s>If you don't know what it's for, you can send it to me</s>, then I can connect to your SSH 😈</p>
<p>The one with <code>.pub</code> is the public key, which can be placed on the server.</p>
<p>Let's look at the public key content:</p>
<pre><code>Get-Content "$env:USERPROFILE\.ssh\sayori_ed25519.pub"
</code></pre>
<p>Copy the entire line, from <code>ssh-ed25519</code> to the end of the comment.</p>
<h2>Putting the Public Key on the Server</h2>
<p>Keep the password-logged-in SSH window open. On the server, prepare the SSH directory:</p>
<pre><code>mkdir -p ~/.ssh
chmod 700 ~/.ssh
nano ~/.ssh/authorized_keys
</code></pre>
<p>Paste the entire line from your local <code>.pub</code> file, then save.</p>
<p>Then change permissions:</p>
<pre><code>chmod 600 ~/.ssh/authorized_keys
</code></pre>
<p>This step seems strange, but it's very important. If the permissions are too loose, SSH will fail directly and won't recognize this key.</p>
<p>Next, write an SSH alias locally. This way, you won't have to type a long string of IP, port, and private key path every time.</p>
<p>Open:</p>
<pre><code>notepad $env:USERPROFILE\.ssh\config
</code></pre>
<p>Write this in:</p>
<pre><code>Host sayori
  HostName &lt;VPS_PUBLIC_IP&gt;
  User root
  Port 22
  IdentityFile ~/.ssh/sayori_ed25519
</code></pre>
<p>Open a new terminal to test:</p>
<pre><code>ssh sayori
</code></pre>
<p>If you can connect directly, it means key login is working.</p>
<p>Note: test in a <em>new</em> terminal. Don't close the old password login window yet; it's like a safety rope. Only let go after everything is changed.</p>
<h2>Disable Password, Change to a Non-Standard Port</h2>
<p>Once key login is stable, you can disable password login and move SSH from the default port 22.</p>
<p>First, choose a non-standard port, for example:</p>
<pre><code>11451
</code></pre>
<p>Don't just copy mine directly. Pick a port between 1024 and 65535 that doesn't conflict with other services.</p>
<p>Then, go to Alibaba Cloud ECS security group and allow this port. This is crucial.</p>
<p>The UFW inside the server is one door, and the Alibaba Cloud security group is another. If you only change the server and not the security group, the new port still won't be accessible.</p>
<p>After allowing the port in the security group, go back to the SSH window and write your own SSH configuration snippet:</p>
<pre><code>nano /etc/ssh/sshd_config.d/99-sayori.conf
</code></pre>
<p>Content:</p>
<pre><code>Port &lt;SSH_PORT&gt;
PubkeyAuthentication yes
PasswordAuthentication no
PermitRootLogin prohibit-password
</code></pre>
<p>Here, <code>PermitRootLogin prohibit-password</code> means root can still log in with a key, but not with a password.</p>
<p>A more rigorous approach is to create a new regular user and then disable root. But for this post, I'm covering the fastest usable method.</p>
<p>After modifying, first check for syntax errors in the SSH configuration:</p>
<pre><code>sshd -t
</code></pre>
<p>No output is good news.</p>
<p>Then restart the SSH service:</p>
<pre><code>systemctl restart ssh
</code></pre>
<p>Do not close the old window yet.</p>
<p>Also change the port in your local <code>~/.ssh/config</code>:</p>
<pre><code>Host sayori
  HostName &lt;VPS_PUBLIC_IP&gt;
  User root
  Port &lt;SSH_PORT&gt;
  IdentityFile ~/.ssh/sayori_ed25519
</code></pre>
<p>Now open a <em>third</em> new terminal to test:</p>
<pre><code>ssh sayori
</code></pre>
<p>If you can connect, it means the new port, key login, and security group are all working.</p>
<p>I would test one more time if the old password login is disabled, for example, by not using the private key and manually connecting to the IP.</p>
<p>If it still asks for a password and lets you in, it means <code>PasswordAuthentication no</code> didn't take effect. Don't rush to continue; figure that out first.</p>
<h2>Configure Firewall</h2>
<p>Once SSH is stable, configure the server's own firewall.</p>
<p>On Ubuntu, UFW is the most convenient:</p>
<pre><code>apt update
apt install -y ufw
</code></pre>
<p>Write the rules first:</p>
<pre><code>ufw default deny incoming
ufw default allow outgoing
ufw allow &lt;SSH_PORT&gt;/tcp
</code></pre>
<p>If you're already planning to run web services, you can allow HTTP / HTTPS for now:</p>
<pre><code>ufw allow 80/tcp
ufw allow 443/tcp
</code></pre>
<p>Then enable it:</p>
<pre><code>ufw enable
ufw status verbose
</code></pre>
<p>Here, I still recommend keeping the old SSH window open. Open a new terminal and connect again:</p>
<pre><code>ssh sayori
</code></pre>
<p>If you can connect, then close the old window.</p>
<h2>After Connecting, Explore the Machine</h2>
<p>Once truly connected and stable, you can take a look at the machine's status:</p>
<pre><code>uname -a
df -h
free -h
systemctl status ssh --no-pager
ufw status numbered
</code></pre>
<p>2H2G isn't a lot of memory, so future service choices will mostly need to be lightweight.</p>
<p>If you can avoid a database, do so. If SQLite works, use SQLite first. If it can be hosted on Cloudflare Pages, don't put it on the VPS.</p>
<p>This machine later ran more than just bots; Vaultwarden, ntfy, Gatus, Portainer, and AI Search Gateway all grew from here.</p>
<p><a href="https://awesome-selfhosted.net/">https://awesome-selfhosted.net/</a>, this is a great "awesome" series website about how to utilize servers!</p>
<p>Looking back, the most useful thing about a personal server isn't a specific service, but rather being forced to understand networking, deployment, security, and backups.</p>
<p>If I were to do it again, I would establish a few habits earlier:</p>
<ol>
<li>Separate directory for each service</li>
<li>Real secrets only in <code>.env</code> or platform Secrets</li>
<li>Write all reproducible commands into documentation</li>
<li>Leave a verification command after each deployment</li>
</ol>
<p>That's all for this post. The server can now be stably connected via SSH, password login is off, the port has been changed, and the firewall has its basic boundaries.</p>
<p>The next post will cover how to use <code>scp</code> to move local configurations to the remote host.</p>
<p>Which means, finally, moving the bot from "it runs on my computer" to "it runs on the server too."</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website & Self-Hosting"></category>
  </entry>
  <entry>
    <title>Hello Sayori</title>
    <link href="https://blog.sayori.org/en/posts/hello-sayori/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/hello-sayori/</id>
    <published>2026-05-21T00:00:00.000Z</published>
    <updated>2026-06-24T00:00:00.000Z</updated>
    <summary>The first post, opening the door for this little personal blog.</summary>
    <content type="html"><![CDATA[<p>Ohayo Sayori！</p>
<p>Who would've thought, just playing the Sayori route in Blue Skies would plunge me into a whole new realm of tinkering (lol).</p>
<p>But there were a lot of contributing factors, haha. If I hadn't joined L-site and gotten free credits from the big shots, I probably wouldn't have even thought about playing with bots... Sigh~, who knows? It's a shame I even topped up $10 on OpenRouter before... now I can't even use foreign models, OpenRouter you ###, I only did it back then to set up the automatic update workflow for my resource site... who would've thought... haha.</p>
<p>Anyway, I'm getting sidetracked. In short, Amiya_desi's little site has officially begun! Hope I can stick with it for a while this time, haha.</p>
<p>Future plans:</p>
<ul>
<li>Organize valuable Obsidian notes into articles.</li>
</ul>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Personal Records"></category>
  </entry>
  <entry>
    <title>What Cloudflare's Free Tier Can Do for Developers: The Cyber Philanthropist's Free-for-All</title>
    <link href="https://blog.sayori.org/en/posts/cloudflare-free-tier-student-guide/cloudflare-free-tier-developer-guide/" rel="alternate" type="text/html"/>
    <id>https://blog.sayori.org/en/posts/cloudflare-free-tier-student-guide/cloudflare-free-tier-developer-guide/</id>
    <published>2026-06-22T00:00:00.000Z</published>
    <updated>2026-06-23T00:00:00.000Z</updated>
    <summary>A rundown of genuinely useful things in Cloudflare's free tier: Pages, Workers, R2, Tunnel, Email Routing, DNS, Web Analytics, and when it's a better fit than a VPS.</summary>
    <content type="html"><![CDATA[<p>Cloudflare isn't called a "cyber philanthropist" in developer circles for no reason.</p>
<p>Its free tier limits are practically overkill for individual developers.</p>
<p>This post rounds up some of the free services I think developers can actually use.</p>
<h2>Registration</h2>
<p><a href="https://dash.cloudflare.com/sign-up">https://dash.cloudflare.com/sign-up</a></p>
<p>Just register with an email. You don't need to link a credit card for most free tier features (some, like R2, require a card but won't charge you unless you exceed limits).</p>
<p>If you can't register, try a different node or an incognito browser.</p>
<h2>Cloudflare Pages</h2>
<p>This is what I use the most.</p>
<p>Pages lets you deploy static websites (HTML, CSS, JS, or build artifacts from frameworks like Astro/Next.js/Hugo) to Cloudflare's global network.</p>
<p>The free tier gives you:</p>
<ul>
<li>Unlimited sites</li>
<li>Unlimited bandwidth</li>
<li>500 builds per month</li>
<li>Automatic HTTPS</li>
<li>Custom domains</li>
<li>Preview deployments (one preview URL per PR)</li>
</ul>
<p>For a personal blog, this pretty much has no limits.</p>
<p>My blog runs on Pages. After a push to the GitHub repo, GitHub Actions builds Astro, then Wrangler uploads it to Pages. The whole process costs nothing.</p>
<p>If you haven't used it yet:</p>
<p><a href="/posts/astro-mizuki-blog-from-zero/astro-mizuki-blog-from-zero-en/">Build a blog just like mine from scratch</a></p>
<h2>Cloudflare Workers</h2>
<p>Workers are Cloudflare's Serverless functions. You can write a small piece of JS/TS, deploy it, and it runs on Cloudflare's edge nodes.</p>
<p>The free tier gives you:</p>
<ul>
<li>100,000 requests per day</li>
<li>10ms CPU time per request</li>
<li>1MB code size</li>
</ul>
<p>Good for:</p>
<ul>
<li>Creating a simple API (e.g., returning random sentences, forwarding requests, making a URL shortener)</li>
<li>Adding a bit of dynamic logic to a static site</li>
<li>Acting as a Webhook receiver</li>
<li>Simple proxies or redirects</li>
</ul>
<p>Not good for:</p>
<ul>
<li>Long-running tasks</li>
<li>Complex backends requiring databases (though you can connect D1 or KV, the free tier has limits)</li>
<li>Services requiring persistent WebSockets</li>
</ul>
<p>If you're just looking to write a blog, Workers won't be immediately useful. But knowing it exists is handy; you'll often encounter it when tinkering with various small tools later on.</p>
<h2>Cloudflare R2</h2>
<p>R2 is object storage, compatible with the S3 API.</p>
<p>The free tier gives you:</p>
<ul>
<li>10GB storage</li>
<li>10 million Class A operations per month (PUT/POST/LIST)</li>
<li>10 million Class B operations per month (GET)</li>
<li>Free egress (this is a killer feature)</li>
</ul>
<p>Good for:</p>
<ul>
<li>Blog image storage (with a custom domain, it's an image host)</li>
<li>Storing backup files</li>
<li>Static asset hosting</li>
<li>File upload storage for small projects</li>
</ul>
<p>Why it's better than OSS: Egress traffic is free. Alibaba Cloud OSS charges for egress, R2 doesn't. For personal blogs and small projects, this difference is huge.</p>
<p>You need to link a credit card to enable R2, but you won't be charged within the free tier.</p>
<h2>Cloudflare Tunnel</h2>
<p>Tunnel lets you securely expose internal services (like Vaultwarden listening only on 127.0.0.1 on your VPS) to the public internet.</p>
<p>How it works:</p>
<pre><code>User
  -&gt; vault.example.com
  -&gt; Cloudflare Network
  -&gt; Cloudflare Tunnel (encrypted connection)
  -&gt; Your VPS 127.0.0.1:8080
  -&gt; Vaultwarden
</code></pre>
<p>Benefits:</p>
<ul>
<li>Your VPS doesn't need to open ports 80/443</li>
<li>No need to apply for SSL certificates yourself</li>
<li>Can be combined with Cloudflare Access for an extra layer of authentication</li>
<li>Origin IP is not exposed</li>
</ul>
<p>My Vaultwarden, ntfy, Gatus, and 1Panel dashboard all use Tunnel.</p>
<p>The free tier has no limit on the number of Tunnels. You can run multiple subdomains through a single Tunnel.</p>
<p>Installation involves running a <code>cloudflared</code> daemon on your VPS; it actively connects outwards, so no inbound rules are needed.</p>
<h2>Cloudflare DNS</h2>
<p>Change your domain's NS to Cloudflare, and you can use its free DNS hosting.</p>
<p>Benefits:</p>
<ul>
<li>Global Anycast for fast resolution</li>
<li>Free DNSSEC</li>
<li>Hides origin IP with Proxy mode</li>
<li>Clear management interface</li>
</ul>
<p>If you bought your domain from another registrar (like Namesilo, Porkbun, SpaceShip, or various domestic cloud providers), you can change the NS to be managed by Cloudflare.</p>
<p>If you're using a free domain (like DNSHE's cc.cd), you'll need to check if that domain service allows NS changes. Some do, some only let you add records on their original platform.</p>
<h2>Cloudflare Email Routing</h2>
<p>Email Routing lets you receive emails using your custom domain and then forward them to your real inbox.</p>
<p>For example:</p>
<pre><code>me@example.com -&gt; forwards to -&gt; Your Gmail/Outlook
</code></pre>
<p>It's free, no need to set up your own mail server.</p>
<p>Good for:</p>
<ul>
<li>Having a contact email for your blog without exposing your real address</li>
<li>Using a custom domain email when signing up for various services</li>
<li>Learning about email-related DNS records (MX, SPF, DKIM)</li>
</ul>
<p>Note: This is only for receiving and forwarding. If you want to send emails from your custom domain, you'll need additional configuration (e.g., using Gmail SMTP + alias, or services like Resend, Mailgun, Zoho Mail).</p>
<h2>Cloudflare Web Analytics</h2>
<p>Without installing any JS scripts, Cloudflare can show you basic traffic data for your website.</p>
<p>You can enable it in the Web Analytics section of the Dashboard.</p>
<p>It's much lighter than Google Analytics:</p>
<ul>
<li>Doesn't track users</li>
<li>Doesn't use cookies</li>
<li>No extra JS loading needed</li>
<li>Privacy-friendly</li>
</ul>
<p>For a personal blog, seeing if people visit daily, where they come from, and which pages they view is usually enough.</p>
<p>If you want more detailed analytics (like event tracking, funnels, custom dimensions), you can look into Umami or Plausible later. But for starters, Cloudflare's built-in option is sufficient.</p>
<h2>Cloudflare Access (Zero Trust Free Tier)</h2>
<p>Access can add a layer of login protection to any of your web services.</p>
<p>For example, if you have an admin panel running at <code>panel.example.com</code> and don't want just anyone to access it, Access can pop up a login page, allowing only authenticated users to enter.</p>
<p>The free tier supports up to 50 users.</p>
<p>Authentication methods can include:</p>
<ul>
<li>Email one-time passcode</li>
<li>GitHub login</li>
<li>Google login</li>
</ul>
<p>My 1Panel dashboard uses Access for protection. Even if the panel itself has a password, an extra layer of entry authentication is always good.</p>
<h2>What Else Is Free</h2>
<p>Other free features I use less often:</p>
<ul>
<li><strong>D1</strong>: SQLite database, runs alongside Workers. 5GB in the free tier.</li>
<li><strong>KV</strong>: Key-value store. The free tier has daily read/write limits but is enough for small projects.</li>
<li><strong>Queues</strong>: Message queue</li>
<li><strong>Images</strong>: Image transformations (the free tier is very limited for this)</li>
<li><strong>Stream</strong>: Video hosting (the free tier is generally insufficient)</li>
<li><strong>Zaraz</strong>: Third-party script management</li>
</ul>
<p>No need to remember all of them. Just know that Cloudflare's free tier is generous, and you can come back to check when you need something.</p>
<h2>When NOT to Use Cloudflare</h2>
<ul>
<li>Long-running background tasks → Use a VPS</li>
<li>Persistent databases and complex queries → Use a VPS or managed database</li>
<li>Persistent WebSocket connections → Workers have limitations</li>
<li>Large file processing → Workers have limited memory and CPU</li>
<li>Sensitive to access speed in mainland China → Cloudflare's free tier might not be fast in China</li>
</ul>
<p>General principle: Put what you can on Cloudflare, and what needs to run persistently on a VPS. They're not replacements, but complementary.</p>
<h2>My Usage Summary</h2>
<pre><code>Blog static files → Cloudflare Pages
Domain DNS → Cloudflare DNS
VPS internal services public access → Cloudflare Tunnel
Admin panel protection → Cloudflare Access
Blog images (considering) → R2
Traffic analytics → Web Analytics
Contact email → Email Routing
</code></pre>
<p>My 2C2G student server only handles things that absolutely need to run persistently. Anything that can be offloaded to Cloudflare doesn't burden the server.</p>
<h2>Further Reading</h2>
<p>awesome-cloudflare: <a href="https://github.com/zhuima/awesome-cloudflare">https://github.com/zhuima/awesome-cloudflare</a></p>
<p>This repo compiles various tools and uses within the Cloudflare ecosystem, with 14k+ stars. If you want to know "what others are doing with Cloudflare," start here.</p>
]]></content>
    <author>
      <name>Amiya_desi</name>
    </author>
    <category term="Website Building & Self-Hosting"></category>
  </entry>
</feed>