<?xml version="1.0" encoding="UTF-8"?><feed
	xmlns="http://www.w3.org/2005/Atom"
	xmlns:thr="http://purl.org/syndication/thread/1.0"
	xml:lang="en-US"
	>
	<title type="text">mypapit  gnu/linux </title>
	<subtitle type="text">Free and Open Source blogger with an attitude</subtitle>

	<updated>2026-11-07T12:39:46Z</updated>

	<link rel="alternate" type="text/html" href="https://blog.mypapit.net/" />
	<id>https://blog.mypapit.net/feed/atom</id>
	<link rel="self" type="application/atom+xml" href="https://blog.mypapit.net/feed/atom" />

	<generator uri="https://wordpress.org/" version="7.1.4">WordPress</generator>
	<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[How to Use Agora: A BYOM LLM Chat Client for Android]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/11/agora-android-byom-llm-chat-ollama-openwebui.html" />

		<id>https://blog.mypapit.net/?p=2805</id>
		<updated>2026-11-07T12:39:46Z</updated>
		<published>2026-11-07T12:39:46Z</published>
		<category scheme="https://blog.mypapit.net/" term="Android" /><category scheme="https://blog.mypapit.net/" term="Open Source" /><category scheme="https://blog.mypapit.net/" term="Tips &#038; Guides" /><category scheme="https://blog.mypapit.net/" term="Agora" /><category scheme="https://blog.mypapit.net/" term="AI chat client" /><category scheme="https://blog.mypapit.net/" term="Android LLM" /><category scheme="https://blog.mypapit.net/" term="BYOM" /><category scheme="https://blog.mypapit.net/" term="LiteLLM" /><category scheme="https://blog.mypapit.net/" term="Local LLM" /><category scheme="https://blog.mypapit.net/" term="Ollama" /><category scheme="https://blog.mypapit.net/" term="Open WebUI" /><category scheme="https://blog.mypapit.net/" term="OpenAI-compatible API" />
		<summary type="html"><![CDATA[<p>Agora is an open-source Android BYOM LLM client that connects to Ollama, Open WebUI, LiteLLM and cloud AI providers. Learn its system prompts, skills and memory features.</p>
<p>The post <a href="https://blog.mypapit.net/2026/11/agora-android-byom-llm-chat-ollama-openwebui.html">How to Use Agora: A BYOM LLM Chat Client for Android</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/11/agora-android-byom-llm-chat-ollama-openwebui.html"><![CDATA[<p>If you use several LLM services, switching between their mobile apps can become inconvenient. <strong>Agora</strong> is an open-source Android chat client that lets you bring your own models (BYOM) and API keys (BYOK). You can connect cloud AI providers, a self-hosted Ollama server, or an OpenAI-compatible API, then select a model from one mobile interface.</p>
<p>For users who already run local LLMs, Agora is particularly interesting because it can work with <strong>Ollama, LiteLLM, Open WebUI</strong> and other compatible endpoints without requiring you to move your models to another service.</p>
<h2>What makes Agora useful?</h2>
<ul>
<li><strong>Multiple AI providers:</strong> Built-in support includes OpenAI, Anthropic, Google Gemini, DeepSeek, Qwen/DashScope, OpenRouter, OpenCode Go, Groq, Ollama and on-device GGUF models through llama.cpp.</li>
<li><strong>Custom API connections:</strong> Add servers using OpenAI-compatible, Anthropic or Google protocols, with your own base URL and credentials.</li>
<li><strong>Custom system prompts:</strong> Create reusable instructions and switch between prompt configurations for different tasks.</li>
<li><strong>Skills and memory:</strong> Agora supports locally stored Markdown skill instructions that the model can read when needed, plus persistent memories and conversation search.</li>
<li><strong>Advanced tools:</strong> Features include MCP connections, web search, conversation branching, context compaction, task automation and remote shell tools.</li>
<li><strong>Local storage:</strong> Conversations are stored on your Android device, with backup and export options.</li>
</ul>
<figure style="text-align:center"><img decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/11/1000734409-be675e12.jpg" alt="Agora Android chat showing a request to create a simple biodata site using a selected Gemma model" width="360" loading="lazy" /><figcaption>Agora&#8217;s conversation view with a selectable model in the bottom bar.</figcaption></figure>
<h2>How to set up Agora on Android</h2>
<ol>
<li>Download and install Agora from its <a href="https://agora.newoether.com/">official website</a>, <a href="https://github.com/newo-ether/Agora/releases/latest">GitHub releases</a> or F-Droid.</li>
<li>Open the conversation drawer, then go to <strong>Settings, then Providers</strong>.</li>
<li>Choose a built-in provider or add a custom provider. Enter the API key and base URL where needed, then select the matching API protocol.</li>
<li>Go to <strong>Settings, then Models</strong>, synchronize the available models and enable the ones you want.</li>
<li>Return to a chat, pick a model from the bottom bar and start chatting.</li>
</ol>
<h3>Connecting Ollama, LiteLLM or Open WebUI</h3>
<p>For a self-hosted setup, you can configure the following connections. The URLs below are examples, so replace the host name with your own server address:</p>
<table>
<thead>
<tr>
<th>Backend</th>
<th>Agora configuration</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Ollama</strong></td>
<td>Use the built-in Ollama provider and enter the reachable Ollama server URL.</td>
</tr>
<tr>
<td><strong>LiteLLM proxy</strong></td>
<td>Add a custom OpenAI-compatible provider, commonly using <code>http://server:4000/v1</code> and the proxy API key if configured.</td>
</tr>
<tr>
<td><strong>Open WebUI</strong></td>
<td>Add a custom OpenAI-compatible provider and use the API base URL, commonly <code>https://your-webui-host/api</code>, with a valid Open WebUI API key.</td>
</tr>
<tr>
<td><strong>Anthropic-compatible API</strong></td>
<td>Choose Anthropic or add a custom provider with the Anthropic protocol and appropriate credentials.</td>
</tr>
</tbody>
</table>
<p>If model discovery fails, try adding the model ID manually. Your Android phone must be able to reach the configured server. For access outside your home network, prefer HTTPS or a private VPN rather than exposing an unsecured LLM endpoint to the public internet.</p>
<h2>System prompts, Markdown skills and memory</h2>
<p>Agora goes beyond ordinary text chat. You can create different system prompts, for example one for programming and another for academic writing. The selected prompt controls what instructions are supplied to the model.</p>
<figure style="text-align:center"><img decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/11/1000734411-f31631f3.jpg" alt="Agora Android system prompt selector showing Global Default, Default and a custom Qwythos prompt" width="360" loading="lazy" /><figcaption>The system prompt selector lets you switch between different instruction profiles.</figcaption></figure>
<p>The <strong>Skills</strong> feature manages reusable Markdown instructions, similar to <code>SKILL.md</code>-style agent workflows. Agora supplies a skill catalog and allows the model to read a relevant file on demand instead of inserting every skill into every request. Its memory features can retain information across chats. As with any model client, review what a skill or memory sends to an external provider.</p>
<h2>Can I use uncensored LLMs?</h2>
<p>Yes, you can connect a compatible self-hosted or on-device open-weight model, including models distributed without the usual instruction-level content restrictions. However, <strong>Agora itself does not guarantee unrestricted answers</strong>. The model, its system prompt, the inference backend and any third-party provider rules still determine its behaviour. Agora is a flexible client, not a way to bypass a hosted provider&#8217;s policies.</p>
<h2>Is Agora private and open source?</h2>
<p>Agora stores its conversations locally and sends model requests to the endpoints you configure, rather than routing every chat through an Agora-operated completion service. However, a cloud provider still receives the requests you send to it. Also be careful with exported backup archives that include credentials, since those exported secrets may not be encrypted.</p>
<p>The app is open source. Current versions from <strong>v2.2.0 onward use GPL-3.0</strong>; older v2.1.0 and earlier releases used the MIT license. Its source code is available on <a href="https://github.com/newo-ether/Agora">GitHub</a>.</p>
<h2>Final thoughts</h2>
<p>Agora is a practical Android client if you switch between commercial APIs and locally hosted LLMs. Its support for several providers, custom system prompts, Markdown skills and memory makes it useful for developers and people running their own AI servers. You keep control over which model and endpoint to use, while the actual privacy and response policies depend on your configuration.</p>
<p>Related guide: <a href="https://blog.mypapit.net/2026/11/convert-pdf-word-odt-markdown-markforge.html">Convert PDF and Office files to Markdown locally for AI</a>.</p>
<p><strong>Links:</strong> <a href="https://agora.newoether.com/">Official website</a> · <a href="https://github.com/newo-ether/Agora">Source code</a> · <a href="https://newo-ether.github.io/Agora/">User manual</a></p>
<p>The post <a href="https://blog.mypapit.net/2026/11/agora-android-byom-llm-chat-ollama-openwebui.html">How to Use Agora: A BYOM LLM Chat Client for Android</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/11/agora-android-byom-llm-chat-ollama-openwebui.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/11/agora-android-byom-llm-chat-ollama-openwebui.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[How to Make AI Explain Difficult Concepts Step by Step with Reexplain For Me SKILL.md]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/11/reexplain-for-me-ai-agent-skill-guide.html" />

		<id>https://blog.mypapit.net/?p=2797</id>
		<updated>2026-11-06T09:24:05Z</updated>
		<published>2026-11-06T09:24:05Z</published>
		<category scheme="https://blog.mypapit.net/" term="Open Source" /><category scheme="https://blog.mypapit.net/" term="Personal Project" /><category scheme="https://blog.mypapit.net/" term="Tips &#038; Guides" /><category scheme="https://blog.mypapit.net/" term="Agent Skills" /><category scheme="https://blog.mypapit.net/" term="AI Agents" /><category scheme="https://blog.mypapit.net/" term="Codex" /><category scheme="https://blog.mypapit.net/" term="Explainable AI" /><category scheme="https://blog.mypapit.net/" term="github" /><category scheme="https://blog.mypapit.net/" term="Technical Learning" />
		<summary type="html"><![CDATA[<p>Introducing Reexplain For Me, my reusable AI agent skill for clearer technical explanations, evidence-based confidence labels, and practical comparisons.</p>
<p>The post <a href="https://blog.mypapit.net/2026/11/reexplain-for-me-ai-agent-skill-guide.html">How to Make AI Explain Difficult Concepts Step by Step with Reexplain For Me SKILL.md</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/11/reexplain-for-me-ai-agent-skill-guide.html"><![CDATA[<p>Sometimes an AI gives you a technically correct answer, but you still cannot follow the explanation. It may skip an important step, introduce too many new terms, or assume you already know a specialist concept.</p>
<p>I created <strong>Reexplain For Me</strong>, a reusable AI agent skill that addresses this problem. Instead of explaining everything from zero, it starts with what you already know and walks through the difficult part, one step at a time.</p>
<h2>What does Reexplain For Me do?</h2>
<p>The skill is intended for adults who already know the basics of a subject, but need help with a particular advanced concept. It is especially useful when reading technical documentation, understanding software behaviour, or comparing implementation choices.</p>
<p>Its instructions tell the AI agent to:</p>
<ul>
<li>Give a short, useful answer before the detailed explanation.</li>
<li>Explain one new idea at a time and define unfamiliar technical terms.</li>
<li>Use one consistent example across several steps, rather than switching examples halfway.</li>
<li>Explain where an analogy stops being accurate.</li>
<li>Correct factual mistakes directly, without unnecessary praise.</li>
<li>Compare choices using their benefits, limitations, risks, and requirements.</li>
</ul>
<h2>Confidence labels help you judge the answer</h2>
<p>Another feature is explicit confidence tagging. The skill asks the AI to distinguish what is supported by evidence from what is inferred or uncertain:</p>
<ul>
<li><code>[Certain]</code>: a claim supported by checked evidence or a demonstrated calculation.</li>
<li><code>[Likely]</code>: a strong inference based on the available evidence.</li>
<li><code>[Guessing]</code>: a claim with insufficient evidence, including an explanation of what information is missing.</li>
</ul>
<p>These labels are not a guarantee that the model is correct. They are a way to make its assumptions and uncertainty easier to inspect.</p>
<h2>How to use Reexplain For Me</h2>
<p>With an AI agent that has the skill installed, invoke it by name and identify where the explanation became difficult:</p>
<pre><code>Use $reexplain-for-me. I know what a database index does.
Walk me through why a query planner might scan the whole table anyway.
Use one example and carry it through each step.</code></pre>
<p>If you still do not understand a particular step, you can ask the agent to return to that step and explain it with a smaller example. You can also include a passage, diagram description, or error message to give the agent more context.</p>
<h2>Can I use it with other AI agents?</h2>
<p>The repository provides the skill in <code>SKILL.md</code> format, with additional Codex metadata under <code>agents/openai.yaml</code>. It is written primarily as a Codex skill, but the instructions are plain text and can be reused in other AI agent environments.</p>
<p>For agents that support compatible skill files, install it using that agent&#8217;s supported skill location or import method. For agents that do not, you can adapt the contents of <code>SKILL.md</code> as custom instructions or a reusable prompt. The exact installation procedure and invocation command depend on the agent; not every platform recognizes <code>$reexplain-for-me</code> automatically.</p>
<h2>Get the skill on GitHub</h2>
<p>Reexplain For Me is available in my GitHub repository. Read the README for the usage example and the complete <code>SKILL.md</code> for its response rules.</p>
<p><strong>Repository:</strong> <a href="https://github.com/mypapit/reexplain-for-me">github.com/mypapit/reexplain-for-me</a></p>
<p>The objective is simple: make AI explanations easier to follow without talking down to technically competent readers, hiding uncertainty, or agreeing with incorrect assumptions.</p>
<p>The post <a href="https://blog.mypapit.net/2026/11/reexplain-for-me-ai-agent-skill-guide.html">How to Make AI Explain Difficult Concepts Step by Step with Reexplain For Me SKILL.md</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/11/reexplain-for-me-ai-agent-skill-guide.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/11/reexplain-for-me-ai-agent-skill-guide.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>mypapit</name>
							<uri>http://mypapit.net</uri>
						</author>

		<title type="html"><![CDATA[How to Convert PDF, Word and ODT to Markdown Locally with MarkForge]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/11/convert-pdf-word-odt-markdown-markforge.html" />

		<id>https://blog.mypapit.net/?p=2795</id>
		<updated>2026-11-05T03:40:35Z</updated>
		<published>2026-11-05T03:40:35Z</published>
		<category scheme="https://blog.mypapit.net/" term="Computers" /><category scheme="https://blog.mypapit.net/" term="docker" /><category scheme="https://blog.mypapit.net/" term="Open Source" /><category scheme="https://blog.mypapit.net/" term="Tips &#038; Guides" /><category scheme="https://blog.mypapit.net/" term="Docker" /><category scheme="https://blog.mypapit.net/" term="Local AI" /><category scheme="https://blog.mypapit.net/" term="MarkForge" /><category scheme="https://blog.mypapit.net/" term="Ollama" /><category scheme="https://blog.mypapit.net/" term="Open WebUI" /><category scheme="https://blog.mypapit.net/" term="PDF to Markdown" /><category scheme="https://blog.mypapit.net/" term="RAG" />
		<summary type="html"><![CDATA[<p>Set up MarkForge with Docker to convert PDF, Word and OpenDocument files to Markdown for Ollama, Open WebUI and local RAG, without exposing confidential documents to unknown online services.</p>
<p>The post <a href="https://blog.mypapit.net/2026/11/convert-pdf-word-odt-markdown-markforge.html">How to Convert PDF, Word and ODT to Markdown Locally with MarkForge</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/11/convert-pdf-word-odt-markdown-markforge.html"><![CDATA[<p>Running a local AI system such as Ollama, Open WebUI, or a Retrieval-Augmented Generation (RAG) application often means preparing a collection of PDF files, Microsoft Word documents, and LibreOffice files. These formats are useful for everyday work, but they are not always easy to parse or index correctly.</p>
<p><strong>MarkForge</strong> converts these files into Markdown, a simple text format suitable for local AI knowledge bases. In this guide, we will install the <a href="https://github.com/Punctiq/markforge">Punctiq version of MarkForge</a> using Docker on Ubuntu Linux and convert documents without sending them to an external service.</p>
<figure class="wp-block-image"><img decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/11/markforge-document-converter-interface.png" alt="MarkForge self-hosted document to Markdown conversion interface"/><figcaption>MarkForge&#8217;s self-hosted document conversion interface. Source: Punctiq project repository.</figcaption></figure>
<h2>What Is MarkForge?</h2>
<p>MarkForge is an open-source, self-hosted document converter. It supports batch processing, Markdown previews, extraction of figures, optional AI-assisted cleanup, and ZIP exports containing converted documents and associated files.</p>
<table>
<thead>
<tr>
<th>Document type</th>
<th>Supported extension</th>
</tr>
</thead>
<tbody>
<tr>
<td>PDF</td>
<td><code>.pdf</code></td>
</tr>
<tr>
<td>Microsoft Word</td>
<td><code>.docx</code></td>
</tr>
<tr>
<td>Legacy Microsoft Word</td>
<td><code>.doc</code></td>
</tr>
<tr>
<td>OpenDocument Text</td>
<td><code>.odt</code></td>
</tr>
</tbody>
</table>
<p><strong>Important:</strong> Several unrelated projects also use the MarkForge name. This article covers <a href="https://github.com/Punctiq/markforge">github.com/Punctiq/markforge</a>. Its supported Office document formats do not include Excel, PowerPoint, or OpenDocument spreadsheet/presentation files.</p>
<h2>Why Markdown for Local AI?</h2>
<p>Markdown is plain text with lightweight structure. It can preserve headings, paragraphs, lists, simple tables, and image references without the additional formatting data found in Word files and PDFs.</p>
<p>For a local RAG system, Markdown content can be split into smaller sections, embedded, and stored in a vector database. Keeping the headings can also make the retrieved passages easier to understand. However, conversion is not a guarantee of accurate extraction. Tables, equations, and multi-column pages still need to be checked.</p>
<h2>Step 1: Install MarkForge with Docker</h2>
<p>We will use Docker on Ubuntu. The project&#8217;s Docker image includes dependencies such as LibreOffice and Pandoc.</p>
<p>Clone the source repository:</p>
<pre><code class="language-bash">git clone https://github.com/Punctiq/markforge.git
cd markforge</code></pre>
<p>Copy the example environment file:</p>
<pre><code class="language-bash">cp .env.example .env</code></pre>
<p>Edit <code>.env</code> and check the following settings:</p>
<pre><code class="language-ini">FLASK_ENV=production
AUTH_ENABLED=false

LLM_PROVIDER=openai
LLM_API_KEY=
LLM_BASE_URL=</code></pre>
<p>With the API key left empty, MarkForge can perform normal document conversion without invoking an external AI model. Keep <code>AUTH_ENABLED=false</code> only if the application remains restricted to your own machine or another trusted environment.</p>
<p>Build and start the application:</p>
<pre><code class="language-bash">docker compose up -d --build</code></pre>
<p>Open <strong><a href="http://127.0.0.1:8010">http://127.0.0.1:8010</a></strong> in a browser on the Docker host. The provided Compose configuration binds port 8010 to the host&#8217;s loopback address, rather than exposing the service directly to the local network or internet.</p>
<p>Check whether the service is responding:</p>
<pre><code class="language-bash">curl http://127.0.0.1:8010/api/v1/health</code></pre>
<h2>Step 2: Convert PDF, Word, and ODT Files</h2>
<ol>
<li>Open the MarkForge web interface.</li>
<li>Select a <code>.pdf</code>, <code>.docx</code>, <code>.doc</code>, or <code>.odt</code> document.</li>
<li>Disable <strong>AI Cleanup</strong> for conversion without LLM calls.</li>
<li>Start conversion and inspect the resulting Markdown preview.</li>
<li>Download the Markdown or the ZIP package containing the output and figures.</li>
</ol>
<p>The ZIP package is helpful when a document has figures that need to remain together with the Markdown file.</p>
<h3>Automate a conversion with curl</h3>
<p>MarkForge also provides a conversion API. For example, to convert <code>manual.pdf</code> into a ZIP package:</p>
<pre><code class="language-bash">curl -f \
  -F "file=@manual.pdf" \
  -F "ai_cleanup=false" \
  -F "output_format=zip" \
  http://127.0.0.1:8010/api/v1/convert \
  -o manual.zip</code></pre>
<p>This approach can be adapted to a local document-processing script. Check the API response and converted content before automatically indexing the output.</p>
<p><strong>PDF limitation:</strong> This version uses PyMuPDF to extract existing text. Image-only scanned pages without selectable text are not automatically processed with OCR. Perform OCR separately before conversion if your PDF consists of scanned pages.</p>
<h2>Step 3: Optional AI Cleanup with Ollama</h2>
<p>MarkForge can optionally send extracted Markdown to an LLM for formatting cleanup. It supports OpenAI-compatible endpoints, including a locally hosted Ollama server.</p>
<p>For MarkForge installed directly on the same host as Ollama, a basic configuration is:</p>
<pre><code class="language-ini">LLM_PROVIDER=ollama
LLM_MODEL=qwen3:4b
LLM_BASE_URL=http://127.0.0.1:11434/v1
LLM_API_KEY=ollama</code></pre>
<p>Use a model that you actually have installed. <strong>Docker users must change the endpoint</strong>: inside the MarkForge container, <code>127.0.0.1</code> refers to the container itself, not the machine running Ollama. Configure a reachable host or Docker network address before enabling cleanup.</p>
<p>Safe, Balanced, and Aggressive cleanup modes are available. For technical, academic, and compliance-related documents, begin with Safe mode and compare the output against the original document. An LLM may alter terminology, numbers, or meaning while attempting to improve formatting.</p>
<h2>Step 4: Import Markdown into a Local AI Knowledge Base</h2>
<p>After conversion, place the Markdown files and extracted figures inside a local folder:</p>
<pre><code>knowledgebase/
??? student-regulations.md
??? research-guidelines.md
??? server-documentation.md
??? figures/
    ??? diagram-01.png
    ??? diagram-02.png</code></pre>
<p>You can then import the documents into an Open WebUI knowledge collection or process them in a custom RAG pipeline. For lengthy material, splitting content by section headings often makes chunks more useful than splitting at arbitrary positions.</p>
<p>Before indexing, check headings, reading order, tables, equations, citations, and references to images. Keep a copy of the source file for future verification.</p>
<h2>Why Privacy Matters When Converting Documents</h2>
<p>Many websites offer free PDF-to-Markdown and Word-to-Markdown conversion. While convenient, <strong>uploading files to a service you do not control may expose confidential information</strong>.</p>
<p>This is particularly important for documents containing student records, unpublished academic manuscripts, internal technical specifications, contracts, financial details, or other personal information.</p>
<p>When using a third-party service, you may not have full visibility into document retention, server logging, subcontractors, or how uploaded data is processed. Privacy claims should be checked against the provider&#8217;s actual terms and technical practices.</p>
<p>Self-hosting reduces unnecessary exposure by keeping processing on infrastructure under your control. It does not automatically guarantee privacy. If you enable a remote LLM provider for AI cleanup, extracted document content may still leave your network.</p>
<p>For sensitive documents, keep conversion local, disable cloud cleanup, restrict access to the MarkForge server, and secure temporary files and converted outputs. Never expose an unauthenticated document converter directly to the public internet.</p>
<h2>Final Thoughts</h2>
<p>MarkForge provides a straightforward way to convert PDF, Word, and OpenDocument Text files into Markdown for Ollama, Open WebUI, and other local AI workflows. Its self-hosted installation is useful when the documents should remain on your own computer or trusted server.</p>
<p>For a private RAG knowledge base, the recommended workflow is simple: convert locally, inspect the Markdown, and then index only the verified content.</p>
<p><strong>Project:</strong> <a href="https://github.com/Punctiq/markforge">Punctiq MarkForge on GitHub</a><br /><strong>License:</strong> Apache License 2.0</p>
<p>The post <a href="https://blog.mypapit.net/2026/11/convert-pdf-word-odt-markdown-markforge.html">How to Convert PDF, Word and ODT to Markdown Locally with MarkForge</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/11/convert-pdf-word-odt-markdown-markforge.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/11/convert-pdf-word-odt-markdown-markforge.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[renogybt-emulator: A Python Emulator for Renogy BT-1 and BT-2]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html" />

		<id>https://blog.mypapit.net/?p=2779</id>
		<updated>2026-11-02T05:28:13Z</updated>
		<published>2026-10-26T02:02:00Z</published>
		<category scheme="https://blog.mypapit.net/" term="Open Source" /><category scheme="https://blog.mypapit.net/" term="Personal Project" /><category scheme="https://blog.mypapit.net/" term="Python" /><category scheme="https://blog.mypapit.net/" term="github" /><category scheme="https://blog.mypapit.net/" term="open source" /><category scheme="https://blog.mypapit.net/" term="opensource" /><category scheme="https://blog.mypapit.net/" term="photovoltaic" /><category scheme="https://blog.mypapit.net/" term="renogy" /><category scheme="https://blog.mypapit.net/" term="solar panels" />
		<summary type="html"><![CDATA[<p>My latest Python project emulates Renogy BT-1 and BT-2 Bluetooth communication for testing solar-monitoring software without a physical controller.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html">renogybt-emulator: A Python Emulator for Renogy BT-1 and BT-2</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html"><![CDATA[<p>I&#8217;ve put my latest project on GitHub: <a href="https://github.com/mypapit/renogybt-emulator/"><strong>renogybt-emulator</strong></a>, a Python library and command-line tool that emulates the Bluetooth interface exposed by Renogy BT-1 and BT-2 modules connected to an MPPT solar charge controller.</p>
<p>The aim is to make it easier to develop and test solar-monitoring software without needing a physical controller, solar panels or batteries on the desk.</p>
<p>&nbsp;</p>
<p><strong>TLDR;<br />
</strong>This software make a Linux computer behave like a Renogy solar charge controller over Bluetooth, so you can test your apps without physical solar equipment.</p>
<p>&nbsp;</p>
<p><strong>Demo Screenshots From Official Renogy Mobile Application</strong></p>
<p><a href="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html/screenshotted-combine-renogy" rel="attachment wp-att-2785"><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-2785" src="https://blog.mypapit.net/wp-content/uploads/2026/10/Screenshotted-combine-renogy.png" alt="" width="1024" height="1536" srcset="https://blog.mypapit.net/wp-content/uploads/2026/10/Screenshotted-combine-renogy.png 1024w, https://blog.mypapit.net/wp-content/uploads/2026/10/Screenshotted-combine-renogy-600x900.png 600w, https://blog.mypapit.net/wp-content/uploads/2026/10/Screenshotted-combine-renogy-683x1024.png 683w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>
<h2>How it works</h2>
<p>The BT-1 and BT-2 modules provide Bluetooth Low Energy (BLE) access to Renogy equipment, using RS232 and RS485 respectively on the controller side. My emulator runs on a Linux computer with a BLE adapter and presents the Bluetooth services and simulated controller data that a compatible client expects.</p>
<p><a href="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html/renogy-emulator-block-diagram" rel="attachment wp-att-2791"><img decoding="async" class="aligncenter size-large wp-image-2791" src="https://blog.mypapit.net/wp-content/uploads/2026/10/renogy-emulator-block-diagram-1024x724.png" alt="" width="525" height="371" srcset="https://blog.mypapit.net/wp-content/uploads/2026/10/renogy-emulator-block-diagram-1024x724.png 1024w, https://blog.mypapit.net/wp-content/uploads/2026/10/renogy-emulator-block-diagram-768x543.png 768w, https://blog.mypapit.net/wp-content/uploads/2026/10/renogy-emulator-block-diagram-468x331.png 468w, https://blog.mypapit.net/wp-content/uploads/2026/10/renogy-emulator-block-diagram.png 1500w" sizes="(max-width: 525px) 100vw, 525px" /></a></p>
<p>&nbsp;</p>
<p>Underneath, it implements the BLE GATT services and characteristics used for communication, together with a Modbus RTU responder. A client sends a request over Bluetooth, and the emulator replies with values from its simulated register bank. Those values include battery voltage, charging current, solar power, temperatures and load status.</p>
<p>This lets a monitoring application connect to an emulated device and exercise its normal communication path.</p>
<p>&nbsp;</p>
<p><span id="more-2779"></span></p>
<h2>A day of solar charging in a few minutes</h2>
<p>There are two operating modes:</p>
<ul>
<li><strong>Static mode</strong> serves a fixed set of readings from a JSON or INI configuration file. Saved changes are picked up on the next Modbus poll, so you can change the simulated conditions while the emulator is running.</li>
<li><strong>Cycle mode</strong> rotates through nighttime, early morning, noon and late afternoon at a configurable interval.</li>
</ul>
<p>The included 24V gel-battery preset moves from no solar generation at night to MPPT charging in the morning and at noon, then float charging in the late afternoon. For example, the noon preset reports 545W of solar power and a battery voltage of 28.4V.</p>
<p>That gives developers a repeatable way to check how a dashboard, logger or automation responds as readings change, without waiting for the actual sun to move across the sky.</p>
<h2>Compatibility so far</h2>
<p>The project documents successful over-the-air testing with both the <strong>official Renogy mobile app</strong> and <a href="https://github.com/cyrils/renogy-bt"><code>renogy-bt</code></a>, emulating a <strong>Renogy Rover MPPT controller (RNG-CTRL-ROVER60)</strong>. This covers live readings, parameter reads, historical daily summaries and changes between simulated operating states.</p>
<p>You can see the app discovering the emulator and displaying its readings in the <a href="https://github.com/mypapit/renogybt-emulator/#verified-compatibility">screenshots in the README</a>. The Rover setup is the verified example; compatibility with other devices and clients needs testing.</p>
<p>Potential uses include testing MQTT and Home Assistant telemetry pipelines, PVOutput loggers, and custom mobile or desktop monitoring applications.</p>
<h2>Trying it out</h2>
<p>The documented setup uses Linux, Python 3.8 or newer, BlueZ and a BLE-capable Bluetooth adapter. The repository includes installation instructions, configuration examples and a prebuilt Python wheel.</p>
<p>After installing the package in the repository&#8217;s virtual environment and preparing the Bluetooth adapter as described in the <a href="https://github.com/mypapit/renogybt-emulator/#fresh-machine-installation--setup-guide">setup guide</a>, you can run the four-state example with:</p>
<pre><code>sudo .venv/bin/renogybt-emulator \
  -c configs/rover_24v_gel_states.json \
  --mode cycle --state-interval 30s -v</code></pre>
<p>This switches operating states every 30 seconds. The interval and initial state can be changed from the command line.</p>
<p>The project was inspired by Cyril Sebastian&#8217;s <code>renogy-bt</code> and is released under the <strong>GNU GPL v3</strong>. It is an independent project and is not an official Renogy product or endorsed by Renogy.</p>
<p><a href="https://github.com/mypapit/renogybt-emulator/"><strong>Get the source code and documentation on GitHub.</strong></a> If you try it with your own client, bug reports with the configuration, debug logs and client details would be useful.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html">renogybt-emulator: A Python Emulator for Renogy BT-1 and BT-2</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/renogybt-emulator-python-renogy-bt1-bt2.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[Critical PHP Flaws: How to Update PHP 8.3, 8.4 and 8.5]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/update-php-critical-rce-vulnerabilities-2026.html" />

		<id>https://blog.mypapit.net/?p=2775</id>
		<updated>2026-10-22T14:31:20Z</updated>
		<published>2026-10-22T14:31:20Z</published>
		<category scheme="https://blog.mypapit.net/" term="PHP" /><category scheme="https://blog.mypapit.net/" term="security" /><category scheme="https://blog.mypapit.net/" term="Tips &#038; Guides" /><category scheme="https://blog.mypapit.net/" term="Ubuntu/Debian" /><category scheme="https://blog.mypapit.net/" term="cve" /><category scheme="https://blog.mypapit.net/" term="hacking" /><category scheme="https://blog.mypapit.net/" term="vulnerabilities" /><category scheme="https://blog.mypapit.net/" term="vulnerability" />
		<summary type="html"><![CDATA[<p>Patch CVE-2026-109618 and CVE-2026-109619, update PHP 8.3, 8.4 and 8.5, and reduce exposure with Apache, Nginx and PHP-FPM mitigation steps.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/update-php-critical-rce-vulnerabilities-2026.html">Critical PHP Flaws: How to Update PHP 8.3, 8.4 and 8.5</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/update-php-critical-rce-vulnerabilities-2026.html"><![CDATA[<p><em>Updated 22 October 2026. Commands below target Ubuntu/Debian package installations.</em></p>
<p>PHP has released emergency fixes for <strong>CVE-2026-109618</strong> and <strong>CVE-2026-109619</strong>, both rated critical at CVSS 9.2. They can allow unauthenticated remote code execution. One involves unsafe out-of-memory cleanup; the other involves stale internal state across requests. Apache mod_php has a demonstrated attack before application code runs. PHP-FPM also requires patching. See the <a href="https://www.php.net/archive/2026.php">official announcement</a>.</p>
<h2>1. Check and update PHP</h2>
<p>Back up your database, application files and configuration. Identify every runtime:</p>
<pre><code>php -v
php --ini
dpkg -l 'php*' 'libapache2-mod-php*'</code></pre>
<p>The CLI version may differ from the website. Check each virtual host, FPM pool, container and hosting panel.</p>
<table>
<thead>
<tr>
<th>Branch</th>
<th>First fixed upstream version</th>
</tr>
</thead>
<tbody>
<tr>
<td>PHP 8.3</td>
<td>8.3.36</td>
</tr>
<tr>
<td>PHP 8.4</td>
<td>8.4.27</td>
</tr>
<tr>
<td>PHP 8.5</td>
<td>8.5.12</td>
</tr>
</tbody>
</table>
<p>Install these or later supported security releases. For PHP 8.3-FPM:</p>
<pre><code>sudo apt update
apt-cache policy php8.3-common php8.3-fpm
sudo apt upgrade
sudo php-fpm8.3 -t
sudo systemctl restart php8.3-fpm</code></pre>
<p>Substitute <code>8.4</code> or <code>8.5</code> for your installed branch. Review package upgrades, including extensions. If Apache uses mod_php:</p>
<pre><code>sudo apache2ctl configtest
sudo systemctl restart apache2</code></pre>
<p><strong>Check vendor backports.</strong> Ubuntu fixes include <code>8.3.6-0ubuntu0.24.04.13</code> for 24.04 and <code>8.5.4-0ubuntu1.5</code> for 26.04. Compare complete revisions against <a href="https://ubuntu.com/security/notices/USN-8948-1">Ubuntu&#8217;s security notice</a>. Other repositories need their own advisories. An older-looking version can contain the fix.</p>
<p>Confirm the web runtime afterward and test login, uploads and database access. Updating WordPress or OJS alone does not update PHP.</p>
<h2>2. Update containers separately</h2>
<p>Host updates do not patch container PHP. Confirm a patched image exists, then replace <code>app</code> with your Compose service:</p>
<pre><code>docker compose pull app
docker compose up -d --no-deps app
docker compose exec app php -v</code></pre>
<p>Custom images require an updated base image and rebuild. Preserve persistent data. Shared-hosting users should request the exact patched revision.</p>
<h2>3. Limit requests before PHP</h2>
<p>In Nginx&#8217;s relevant <code>server</code> block:</p>
<pre><code>client_max_body_size 8m;</code></pre>
<p>Or inside the Apache virtual host:</p>
<pre><code>LimitRequestBody 8388608</code></pre>
<p>See the <a href="https://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size">Nginx</a> and <a href="https://httpd.apache.org/docs/2.4/mod/core.html#limitrequestbody">Apache</a> documentation. These impose an 8 MiB body limit. Adjust for legitimate uploads. In the active web runtime&#8217;s <code>php.ini</code>:</p>
<pre><code>post_max_size = 8M
upload_max_filesize = 6M
max_file_uploads = 5
max_input_vars = 1000
max_input_nesting_level = 32
session.upload_progress.enabled = 0</code></pre>
<p>Typical Ubuntu paths are <code>/etc/php/8.3/fpm/php.ini</code> for FPM and <code>/etc/php/8.3/apache2/php.ini</code> for mod_php. Adjust the branch number. <code>php --ini</code> reports CLI configuration only.</p>
<p>Test these example values. Disable file uploads if unused. Apply upload-progress settings at startup, then restart workers; application code and FPM <code>.user.ini</code> are too late for the confirmed early path.</p>
<p>Test Nginx with <code>sudo nginx -t</code> before reloading, or Apache with <code>sudo apache2ctl configtest</code>. These limits reduce exposure; they do not fix either CVE.</p>
<h2>4. Emergency mitigation while patching</h2>
<p>Prefer removing public PHP access and serving a static maintenance page. A PHP maintenance plugin still invokes PHP.</p>
<p>The <a href="https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w">OOM advisory</a> recommends this incomplete emergency measure in the relevant FPM pool, such as <code>/etc/php/8.3/fpm/pool.d/www.conf</code>:</p>
<pre><code>php_admin_value[memory_limit] = -1</code></pre>
<p>This removes one controllable OOM trigger but permits unlimited per-request PHP memory, increasing denial-of-service risk. Use frontend limits and suitable cgroup/container boundaries. Underlying allocation failures remain dangerous; do not substitute <code>RLIMIT_AS</code> or <code>RLIMIT_DATA</code>. Audit overrides and restart all workers. Restore suitable finite PHP limits after patching.</p>
<p>For PHP 8.5, also set <code>fatal_error_backtraces=0</code> in startup configuration. Remove invalid or obsolete per-request INI settings. These address specific <a href="https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp">stale-state paths</a> only. Hiding warnings provides no protection.</p>
<h2>5. Retire public PHP 7.4 applications</h2>
<p>PHP 7.4 <a href="https://www.php.net/eol.php">reached upstream end of life on 28 November 2022</a>. Retire unused applications or migrate them to supported PHP. Legacy source patches and vendor fixes exist, but require explicit verification and should support temporary migration arrangements.</p>
<p>Remove forgotten subdomains, restrict administration through VPN/access policies, and keep FPM off public port 9000. Review logs, unexpected files, accounts and scheduled tasks. Patching does not remove existing backdoors. If compromise is suspected, isolate the system and preserve evidence. Follow <a href="https://www.ncsc.gov.uk/news/critical-security-issue-affecting-php">NCSC guidance</a>.</p>


<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.mypapit.net/2026/10/update-php-critical-rce-vulnerabilities-2026.html">Critical PHP Flaws: How to Update PHP 8.3, 8.4 and 8.5</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/update-php-critical-rce-vulnerabilities-2026.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/update-php-critical-rce-vulnerabilities-2026.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[How to Recover PDF Passwords with pdfcrack and NVIDIA-Accelerated Hashcat]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/recover-pdf-password-pdfcrack-nvidia-hashcat.html" />

		<id>https://blog.mypapit.net/?p=2766</id>
		<updated>2026-10-21T22:33:45Z</updated>
		<published>2026-10-21T22:33:44Z</published>
		<category scheme="https://blog.mypapit.net/" term="Nvidia" /><category scheme="https://blog.mypapit.net/" term="security" /><category scheme="https://blog.mypapit.net/" term="cracking" /><category scheme="https://blog.mypapit.net/" term="nvidia" /><category scheme="https://blog.mypapit.net/" term="passwords" /><category scheme="https://blog.mypapit.net/" term="pdf" /><category scheme="https://blog.mypapit.net/" term="recovery" />
		<summary type="html"><![CDATA[<p>Recover PDF passwords on Linux with pdfcrack, use Hashcat for NVIDIA acceleration, and find password dictionaries for small first attempts.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/recover-pdf-password-pdfcrack-nvidia-hashcat.html">How to Recover PDF Passwords with pdfcrack and NVIDIA-Accelerated Hashcat</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/recover-pdf-password-pdfcrack-nvidia-hashcat.html"><![CDATA[<p>Forgotten the password to an old PDF? You can try recovering it locally on Linux with <a href="https://pdfcrack.sourceforge.net/">pdfcrack</a>.</p>
<p>This guide covers recovery of the password needed to open a PDF. Use it on your own files or files you have permission to recover.</p>
<p>&nbsp;</p>
<p><strong>IMPORTANT:</strong> <strong>pdfcrack runs on the CPU and has no built-in CUDA or NVIDIA GPU support</strong>. For NVIDIA acceleration, use <a href="https://hashcat.net/hashcat/">Hashcat</a> instead.</p>
<h2>Start with a small password dictionary</h2>
<p>A dictionary is a text file containing one password candidate per line. Start with a short list of passwords you remember using, then try common-password lists. This keeps the first attempt quick and helps check that the setup works before running a larger job.</p>
<ul>
<li><a href="https://github.com/danielmiessler/SecLists/blob/master/Passwords/Common-Credentials/10k-most-common.txt">SecLists 10k common passwords</a>: a useful first public list. <a href="https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/10k-most-common.txt">Download the plain text file</a>.</li>
<li><a href="https://github.com/danielmiessler/SecLists/tree/master/Passwords">SecLists password collection</a>: browse other lists when the initial attempt fails. Choose password lists rather than web directory or URL lists.</li>
<li><a href="https://crackstation.net/crackstation-wordlist-password-cracking-dictionary.htm">CrackStation dictionaries</a>: the download page offers a human-password list of about 64 million entries and a full dictionary requiring about 15 GiB when extracted. Try these later, after smaller lists.</li>
</ul>
<p>Download the small SecLists file on Ubuntu:</p>
<pre><code>wget -O common-passwords.txt 'https://raw.githubusercontent.com/danielmiessler/SecLists/master/Passwords/Common-Credentials/10k-most-common.txt'</code></pre>
<p>You can also make a shorter first pass:</p>
<pre><code>head -n 1000 common-passwords.txt &gt; small.txt</code></pre>
<p>This takes the first 1,000 lines. It does not guarantee that they are the best candidates. Extract compressed dictionaries before using them. A larger dictionary takes longer and still cannot recover a password that is absent from the list.</p>
<h2>Recover a PDF password with pdfcrack</h2>
<p>Install pdfcrack on Ubuntu:</p>
<pre><code>sudo apt update
sudo apt install pdfcrack wget</code></pre>
<p>Replace <code>locked.pdf</code> with your PDF filename:</p>
<pre><code>pdfcrack -f locked.pdf -w small.txt</code></pre>
<p>The <code>-f</code> option selects the PDF and <code>-w</code> selects the dictionary. User-password recovery is the default. If the first list fails, repeat with <code>common-passwords.txt</code>. See the <a href="https://manpages.debian.org/testing/pdfcrack/pdfcrack.1.en.html">pdfcrack manual</a> for other options.</p>
<p>The project documents support for standard security-handler revisions 2, 3 and 4. Unsupported encryption requires another tool. Installing NVIDIA drivers will not add GPU support to pdfcrack.</p>
<h2>Use Hashcat for NVIDIA acceleration</h2>
<p>Install Hashcat and the supporting tools:</p>
<pre><code>sudo apt install hashcat git python3
nvidia-smi
hashcat -I</code></pre>
<p>You need a working NVIDIA driver and a compatible CUDA installation. The <a href="https://hashcat.net/hashcat/">Hashcat requirements page</a> lists the NVIDIA CUDA Toolkit requirement. Confirm that <code>hashcat -I</code> detects your NVIDIA GPU before continuing. A working <code>nvidia-smi</code> alone does not confirm that Hashcat can use it.</p>
<p>Hashcat needs an extracted password-verification record, rather than the PDF itself. The third-party <a href="https://github.com/sighook/pdf2hashcat">pdf2hashcat script</a> can prepare it locally:</p>
<pre><code>git clone https://github.com/sighook/pdf2hashcat.git
python3 pdf2hashcat/pdf2hashcat.py locked.pdf &gt; locked.hash
hashcat --identify locked.hash</code></pre>
<p>Select the matching PDF mode using the identification output and <a href="https://hashcat.net/wiki/doku.php?id=example_hashes">Hashcat&#8217;s example hashes</a>. The encryption settings determine the mode. The PDF filename or version alone is insufficient.</p>
<p>For example, <strong>only if mode 10500 matches your extracted record</strong>:</p>
<pre><code>hashcat -m 10500 -a 0 locked.hash common-passwords.txt
hashcat -m 10500 locked.hash --show</code></pre>
<p>Here, <code>-a 0</code> selects a dictionary attack, while <code>--show</code> displays recovered results. Check the startup output to confirm that the NVIDIA device is being used. Mode 10500 is not suitable for every PDF.</p>
<p><code>Exhausted</code> means the selected candidates were tried without a match. It does not mean the PDF has no password. GPU acceleration can increase guessing speed, but recovery time depends on the encryption and password. A long random password may remain impractical to recover.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/recover-pdf-password-pdfcrack-nvidia-hashcat.html">How to Recover PDF Passwords with pdfcrack and NVIDIA-Accelerated Hashcat</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/recover-pdf-password-pdfcrack-nvidia-hashcat.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/recover-pdf-password-pdfcrack-nvidia-hashcat.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[Revisiting Midnight Commander: A Classic Linux File Manager]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/midnight-commander-linux-terminal-file-manager.html" />

		<id>https://blog.mypapit.net/?p=2744</id>
		<updated>2026-10-13T04:26:18Z</updated>
		<published>2026-10-19T02:05:00Z</published>
		<category scheme="https://blog.mypapit.net/" term="General" /><category scheme="https://blog.mypapit.net/" term="GNU/Linux" /><category scheme="https://blog.mypapit.net/" term="cli" /><category scheme="https://blog.mypapit.net/" term="opensource" /><category scheme="https://blog.mypapit.net/" term="terminal" />
		<summary type="html"><![CDATA[<p>Revisit Midnight Commander’s familiar blue panels, learn how to install it on Ubuntu, and use its keyboard shortcuts to manage files in the terminal.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/midnight-commander-linux-terminal-file-manager.html">Revisiting Midnight Commander: A Classic Linux File Manager</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/midnight-commander-linux-terminal-file-manager.html"><![CDATA[<p>Some Linux tools bring back memories as soon as you open them. Midnight Commander is one of those tools. Its familiar blue panels, text menus, and function keys recall the days when managing files in a terminal was an ordinary part of using a computer.</p>
<p>Known simply as <code>mc</code>, <a href="https://midnight-commander.org/">GNU Midnight Commander</a> is a terminal file manager with two directory panels. Open your source folder on one side and the destination on the other, then browse and copy files using the keyboard.</p>
<figure><img decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/10/midnight-commander-terminal-screenshot.png" alt="Midnight Commander showing two directory panels and a function key menu in the terminal" width="1268" height="1086" style="max-width:100%;height:auto;" /><figcaption>Midnight Commander’s familiar two-panel interface. Screenshot from the <a href="https://midnight-commander.org/">official Midnight Commander project website</a>.</figcaption></figure>
<h2>The appeal of those blue panels</h2>
<p>For anyone who remembers DOS-era file managers, this layout feels familiar. The available actions appear along the bottom of the screen, and the keyboard does most of the work. There is something satisfying about seeing both folders at once and moving through them without repeatedly typing <code>ls</code> and <code>cd</code>.</p>
<p>Midnight Commander also remains useful when working on a Linux server through SSH. It runs inside the terminal, so you can browse directories, inspect files, and organise folders without opening a graphical desktop. It includes a file viewer and an editor, too.</p>
<h2>How to install Midnight Commander on Ubuntu</h2>
<p>Install it using Ubuntu’s package manager:</p>
<pre><code>sudo apt update
sudo apt install mc</code></pre>
<p>Then launch it:</p>
<pre><code>mc</code></pre>
<p>Start with these shortcuts, documented in the <a href="https://source.midnight-commander.org/man/mc.html">official manual</a>:</p>
<table>
<thead>
<tr>
<th>Key</th>
<th>Action</th>
</tr>
</thead>
<tbody>
<tr>
<td>Tab</td>
<td>Switch between panels</td>
</tr>
<tr>
<td>F1</td>
<td>Open help</td>
</tr>
<tr>
<td>F3</td>
<td>View a file</td>
</tr>
<tr>
<td>F4</td>
<td>Edit a file</td>
</tr>
<tr>
<td>F5</td>
<td>Copy files</td>
</tr>
<tr>
<td>F6</td>
<td>Move or rename files</td>
</tr>
<tr>
<td>F7</td>
<td>Create a directory</td>
</tr>
<tr>
<td>F8</td>
<td>Delete files</td>
</tr>
<tr>
<td>F10</td>
<td>Quit</td>
</tr>
</tbody>
</table>
<p>Modern desktops have changed how we manage files, but this old style still has its appeal. Two panels, clear actions, and a keyboard within reach are enough to make routine file management comfortable. If you have not used Midnight Commander for years, try typing <code>mc</code> again.</p>
<h2>References</h2>
<ul>
<li><a href="https://midnight-commander.org/">Midnight Commander: official website and installation instructions</a></li>
<li><a href="https://source.midnight-commander.org/man/mc.html">Midnight Commander manual: commands and keyboard shortcuts</a></li>
<li><a href="https://github.com/MidnightCommander/mc">Midnight Commander source code on GitHub</a></li>
</ul>
<p>The post <a href="https://blog.mypapit.net/2026/10/midnight-commander-linux-terminal-file-manager.html">Revisiting Midnight Commander: A Classic Linux File Manager</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/midnight-commander-linux-terminal-file-manager.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/midnight-commander-linux-terminal-file-manager.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[Remembering WGAfakap.exe, a Windows XP Genuine Advantage removal tool &#8211; It&#8217;s already 20 years!]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/remembering-wgafakap-exe-its-already-20-years.html" />

		<id>https://blog.mypapit.net/?p=2756</id>
		<updated>2026-10-16T01:25:08Z</updated>
		<published>2026-10-16T01:18:23Z</published>
		<category scheme="https://blog.mypapit.net/" term="Personal Project" /><category scheme="https://blog.mypapit.net/" term="c programming language" /><category scheme="https://blog.mypapit.net/" term="desktop" /><category scheme="https://blog.mypapit.net/" term="microsoft windows" /><category scheme="https://blog.mypapit.net/" term="visual studio" /><category scheme="https://blog.mypapit.net/" term="windows xp" />
		<summary type="html"><![CDATA[<p>Twenty years ago I wrote WGAfakap.exe, a simple windows application that removes the Windows XP Genuine Advantage Tattoo. WGAfakap was widely used around the world to help individuals or companies who has purchased a legitimate Windows XP from being nagged by the notorious &#8220;You May Be A Victim Of Software Counterfeiting, Solve It Now! &#8221; screen. [&#8230;]</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/remembering-wgafakap-exe-its-already-20-years.html">Remembering WGAfakap.exe, a Windows XP Genuine Advantage removal tool &#8211; It&#8217;s already 20 years!</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/remembering-wgafakap-exe-its-already-20-years.html"><![CDATA[
<p class="wp-block-paragraph">Twenty years ago I wrote WGAfakap.exe, a simple windows application that removes the Windows XP Genuine Advantage Tattoo. </p>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="404" height="181" src="https://blog.mypapit.net/wp-content/uploads/2026/10/image-1.png" alt="" class="wp-image-2757" style="width:404px;height:auto"/></figure>



<figure class="wp-block-image size-full is-resized"><img loading="lazy" decoding="async" width="428" height="398" src="https://blog.mypapit.net/wp-content/uploads/2026/10/image-3.png" alt="" class="wp-image-2759" style="width:433px;height:auto"/></figure>



<p class="wp-block-paragraph">WGAfakap was widely used around the world to help individuals or companies who has purchased a legitimate Windows XP from being nagged by the notorious &#8220;<a rtrvr-ls="5~hs,8~hs" rtrvr-ro="50" href="https://www.nairaland.com/280867/may-victim-software-counterfeiting-solve#3987920">You May Be A Victim Of Software Counterfeiting, Solve It Now!</a> &#8221; screen.</p>



<p class="wp-block-paragraph">I used Microsoft Visual Studio 6 and libctiny and wcrt library to keep WGAfakap small. And the result was a very small (less than 8kb of executable!) <a href="https://blog.mypapit.net/2006/05/solution-to-libctiny-and-wcrt-lnk2001-unresolved-external-symbol-__chkstk.html">https://blog.mypapit.net/2006/05/solution-to-libctiny-and-wcrt-lnk2001-unresolved-external-symbol-__chkstk.html</a></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">I was obsessed with optimization and efficiency because I was poor back then. Couldn&#8217;t afford a decent computer with a lot of storage space and speed. Thus, efficiency was everything to me.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="470" height="273" src="https://blog.mypapit.net/wp-content/uploads/2026/10/image-2.png" alt="" class="wp-image-2758" srcset="https://blog.mypapit.net/wp-content/uploads/2026/10/image-2.png 470w, https://blog.mypapit.net/wp-content/uploads/2026/10/image-2-468x272.png 468w" sizes="auto, (max-width: 470px) 100vw, 470px" /></figure>



<p class="wp-block-paragraph">Although there are attempts to supress it, WGAfakap was famous and it was distributed through message boards and was being used across the world.</p>



<p class="wp-block-paragraph">With careful searching, archived message board threads explaining how to use WGAfakap can still be found. The most recent of these discussions date to 2010, four years after its initial development</p>



<p class="wp-block-paragraph">Most WGAfakap users probably almost reached 40 years old now. Give a shout out if you&#8217;ve heard or ever used WGAfakap!</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.mypapit.net/2026/10/remembering-wgafakap-exe-its-already-20-years.html">Remembering WGAfakap.exe, a Windows XP Genuine Advantage removal tool &#8211; It&#8217;s already 20 years!</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/remembering-wgafakap-exe-its-already-20-years.html#comments" thr:count="3" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/remembering-wgafakap-exe-its-already-20-years.html/feed/atom" thr:count="3" />
			<thr:total>3</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[LobiShell: SSH Access to Linux Servers from Android]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/lobishell-ssh-client-android-linux-servers.html" />

		<id>https://blog.mypapit.net/?p=2749</id>
		<updated>2026-10-13T04:23:37Z</updated>
		<published>2026-10-15T02:57:00Z</published>
		<category scheme="https://blog.mypapit.net/" term="SSH" /><category scheme="https://blog.mypapit.net/" term="android" /><category scheme="https://blog.mypapit.net/" term="Homelab" /><category scheme="https://blog.mypapit.net/" term="linux" /><category scheme="https://blog.mypapit.net/" term="LobiShell" /><category scheme="https://blog.mypapit.net/" term="ssh" />
		<summary type="html"><![CDATA[<p>LobiShell is an Android SSH client with Mosh, SCP, port forwarding, SSH identities and WebDAV sync. A look at its features for Linux server administration.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/lobishell-ssh-client-android-linux-servers.html">LobiShell: SSH Access to Linux Servers from Android</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/lobishell-ssh-client-android-linux-servers.html"><![CDATA[<p>Sometimes I need to check a Linux server when I&#8217;m away from my laptop. For small jobs, an Android SSH client is enough. <a href="https://play.google.com/store/apps/details?id=de.lobianco.saftssh">LobiShell</a>, developed by Lobianco Home Lab, is one option worth looking at.</p>
<p>It runs SSH sessions from an Android phone and also supports Mosh, SCP file transfers, port forwarding and SSH key management. These are useful features when you manage more than one Linux machine.</p>
<p><strong>Advantages:</strong> LobiShell supports putty based private key format.</p>
<h2>Connecting to your servers</h2>
<p>LobiShell lets you save server connections and manage identities. A typical SSH connection needs the server address, SSH port, username and a password or private key. Once connected, you can use the terminal for commands such as:</p>
<pre><code>uptime
free -h
df -h
docker ps
systemctl status nginx</code></pre>
<p>The saved connections screen makes it easier to move between several machines without re-entering their details.</p>
<figure class="wp-block-image aligncenter" style="max-width: 280px; margin: 18px auto;"><img loading="lazy" decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/10/lobishell-official-screenshot-1.webp" alt="LobiShell connection manager, showing saved hosts and identities." width="180" height="320" /><figcaption>LobiShell connection manager, showing saved hosts and identities.</figcaption></figure>
<h2>Finding devices on your network</h2>
<p>LobiShell includes a network scanner that can help find devices on a local network. This is handy when you have several servers, small PCs or other machines in a homelab. You should still verify the host&#8217;s SSH fingerprint before trusting a new connection.</p>
<figure class="wp-block-image aligncenter" style="max-width: 280px; margin: 18px auto;"><img loading="lazy" decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/10/lobishell-official-screenshot-2.webp" alt="LobiShell local network scan and discovered devices." width="180" height="320" /><figcaption>LobiShell local network scan and discovered devices.</figcaption></figure>
<h2>SSH, Mosh and file transfers</h2>
<p>Regular SSH works well on a stable connection. LobiShell also supports Mosh, which is designed to cope better with intermittent connections and network changes. Mosh requires server-side setup, so it is not a drop-in replacement on every host.</p>
<p>SCP support lets you upload or download files, while SSH port forwarding can provide access to an internal service through an encrypted connection. For example, that can be useful when a web interface is restricted to the server&#8217;s private network.</p>
<h2>Authentication and saved commands</h2>
<p>The Identity Store manages SSH keys and passwords. LobiShell also advertises FIDO2 authentication with compatible hardware security keys. It has command snippets, too, so commands you frequently run can be saved instead of typed each time.</p>
<p>For sensitive servers, I would still use key-based login, verify host keys, and avoid exposing SSH directly to the public internet when a VPN is available.</p>
<h2>Terminal appearance and backups</h2>
<p>There are settings for colours, fonts and interface layout. That matters more than it sounds on a small touchscreen, especially when you have to read logs or work in a terminal for a while.</p>
<div class="wp-block-columns" style="display: flex; gap: 14px; flex-wrap: wrap; align-items: start;">
<div class="wp-block-column" style="flex: 1 1 180px;">
<figure class="wp-block-image aligncenter" style="max-width: 280px; margin: 18px auto;"><img loading="lazy" decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/10/lobishell-official-screenshot-3.webp" alt="LobiShell app colour and theme settings." width="180" height="320" /><figcaption>LobiShell app colour and theme settings.</figcaption></figure>
</div>
<div class="wp-block-column" style="flex: 1 1 180px;">
<figure class="wp-block-image aligncenter" style="max-width: 280px; margin: 18px auto;"><img loading="lazy" decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/10/lobishell-official-screenshot-4.webp" alt="LobiShell terminal appearance and interface options." width="180" height="320" /><figcaption>LobiShell terminal appearance and interface options.</figcaption></figure>
</div>
</div>
<p>For moving settings between devices, LobiShell supports WebDAV synchronization, including compatible services such as Nextcloud. It also supports local peer-to-peer synchronization and exportable backups, with optional AES-256-GCM encryption.</p>
<h2>LobiShell as SSH Client</h2>
<p>If you only open an SSH terminal once in a while, a simple client may be sufficient. LobiShell becomes more interesting if you manage several servers and want saved identities, snippets, file transfers and synchronization in the same app.</p>
<p>The limitations are mostly those of working on a phone. Long commands and detailed configuration work are still easier with a keyboard and larger screen. But for checking a service, reading logs or restarting a container, it is a practical tool to keep installed.</p>
<p><strong>Download:</strong> <a href="https://play.google.com/store/apps/details?id=de.lobianco.saftssh">LobiShell on Google Play</a>.</p>
<p><small>App details and screenshots: Google Play listing by Lobianco Home Lab. Features may change with future releases.</small></p>
<p>The post <a href="https://blog.mypapit.net/2026/10/lobishell-ssh-client-android-linux-servers.html">LobiShell: SSH Access to Linux Servers from Android</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/lobishell-ssh-client-android-linux-servers.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/lobishell-ssh-client-android-linux-servers.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[A Guide to Melty: Game Mashups and AI Mod Creation]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/melty-ai-game-mashups.html" />

		<id>https://blog.mypapit.net/?p=2741</id>
		<updated>2026-10-13T04:20:25Z</updated>
		<published>2026-10-13T03:27:00Z</published>
		<category scheme="https://blog.mypapit.net/" term="Games" /><category scheme="https://blog.mypapit.net/" term="minecraft" /><category scheme="https://blog.mypapit.net/" term="games" />
		<summary type="html"><![CDATA[<p>Explore Melty, a free Windows app for game mashups, with SkyCraft and Elden Craft examples and AI tools for creating your own mods.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/melty-ai-game-mashups.html">A Guide to Melty: Game Mashups and AI Mod Creation</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/melty-ai-game-mashups.html"><![CDATA[<p>Ever wondered what Minecraft would look like inside Skyrim? <a href="https://melty.gg/">Melty</a> offers game mashups that combine elements from games you already own.</p>
<p>One example is <strong>SkyCraft</strong>, where you explore Skyrim as a Minecraft player. Another is <strong>Elden Craft</strong>, which brings Minecraft elements into Elden Ring.</p>
<figure class="wp-caption"><img loading="lazy" decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/10/melty-skycraft-screenshot.webp" alt="Official Melty SkyCraft screenshot showing a Minecraft-style player in Skyrim" width="1920" height="1080" /><figcaption>SkyCraft. Screenshot from <a href="https://melty.gg/">Melty’s official website</a>.</figcaption></figure>
<p>Melty is currently free for Windows. Choose a mashup and press Play. According to its website, the app downloads the mod, handles the required setup and starts the game. Multiplayer mashups also provide invite links for friends.</p>
<figure class="wp-caption"><img loading="lazy" decoding="async" src="https://blog.mypapit.net/wp-content/uploads/2026/10/melty-elden-craft-screenshot.webp" alt="Official Melty Elden Craft screenshot combining Minecraft elements with Elden Ring" width="1280" height="720" /><figcaption>Elden Craft. Screenshot from <a href="https://melty.gg/">Melty’s official website</a>.</figcaption></figure>
<p>The AI part comes into creating your own mashup. Melty provides instructions for coding agents such as Claude Code or Codex. You describe your idea, and the agent works on building and publishing it.</p>
<p>You still need to own the required games. This looks interesting for players who enjoy experimenting with mods and unusual game combinations.</p>
<p><a href="https://melty.gg/download">Download Melty</a> or <a href="https://melty.gg/">visit melty.gg</a> to learn more.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/melty-ai-game-mashups.html">A Guide to Melty: Game Mashups and AI Mod Creation</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/melty-ai-game-mashups.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/melty-ai-game-mashups.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[UiTM Korporat Minecraft Skinpack Released]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/10/uitm-korporat-minecraft-skinpack-released.html" />

		<id>https://blog.mypapit.net/?p=2736</id>
		<updated>2026-10-12T03:26:19Z</updated>
		<published>2026-10-12T03:22:46Z</published>
		<category scheme="https://blog.mypapit.net/" term="minecraft" />
		<summary type="html"><![CDATA[<p>UiTM Korporat 2.0.0 brings 21 UiTM-inspired skins to Minecraft Bedrock, accompanied by an academic article.</p>
<p>The post <a href="https://blog.mypapit.net/2026/10/uitm-korporat-minecraft-skinpack-released.html">UiTM Korporat Minecraft Skinpack Released</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/10/uitm-korporat-minecraft-skinpack-released.html"><![CDATA[<p>I have released <a href="https://mypapit.net/uitm-minecraft-skins/">UiTM Korporat 2.0.0</a>, a collection of 21 skins for Minecraft Bedrock featuring UiTM-inspired corporate attire, graduation robes and other characters. You can preview the skins and download the skinpack from the website.</p>
<p>The skinpack is accompanied by an academic article on representing UiTM corporate identity and attire through Minecraft avatars. <a href="https://mypapit.net/pub/articles/representation-uitm-corporate-identity-attire-minecraft-avatars.html">Read the accompanying article</a>.</p>


<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="845" src="https://blog.mypapit.net/wp-content/uploads/2026/10/image-1024x845.png" alt="" class="wp-image-2737" srcset="https://blog.mypapit.net/wp-content/uploads/2026/10/image-1024x845.png 1024w, https://blog.mypapit.net/wp-content/uploads/2026/10/image-768x634.png 768w, https://blog.mypapit.net/wp-content/uploads/2026/10/image-468x386.png 468w, https://blog.mypapit.net/wp-content/uploads/2026/10/image.png 1075w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.mypapit.net/2026/10/uitm-korporat-minecraft-skinpack-released.html">UiTM Korporat Minecraft Skinpack Released</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/10/uitm-korporat-minecraft-skinpack-released.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/10/uitm-korporat-minecraft-skinpack-released.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[How to use openssl to generate 48 random hex numbers for beare token use.]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/09/how-to-use-openssl-to-generate-48-random-hex-numbers-for-beare-token-use.html" />

		<id>https://blog.mypapit.net/?p=2733</id>
		<updated>2026-09-13T06:17:37Z</updated>
		<published>2026-09-13T06:17:34Z</published>
		<category scheme="https://blog.mypapit.net/" term="docker" /><category scheme="https://blog.mypapit.net/" term="security" /><category scheme="https://blog.mypapit.net/" term="Server" /><category scheme="https://blog.mypapit.net/" term="linux" /><category scheme="https://blog.mypapit.net/" term="openssl" /><category scheme="https://blog.mypapit.net/" term="ubuntu" />
		<summary type="html"><![CDATA[<p>Some services require you to generate random hex numbers to be used as a password or random auth token for authentication. The simplest method is to use this openssl cli command</p>
<p>The post <a href="https://blog.mypapit.net/2026/09/how-to-use-openssl-to-generate-48-random-hex-numbers-for-beare-token-use.html">How to use openssl to generate 48 random hex numbers for beare token use.</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/09/how-to-use-openssl-to-generate-48-random-hex-numbers-for-beare-token-use.html"><![CDATA[
<p class="wp-block-paragraph">Some services require you to generate random hex numbers to be used as a password or random auth token for authentication. The simplest method is to use this openssl cli command</p>



<pre class="wp-block-code"><code>openssl rand -hex 24</code></pre>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.mypapit.net/2026/09/how-to-use-openssl-to-generate-48-random-hex-numbers-for-beare-token-use.html">How to use openssl to generate 48 random hex numbers for beare token use.</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/09/how-to-use-openssl-to-generate-48-random-hex-numbers-for-beare-token-use.html#comments" thr:count="19" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/09/how-to-use-openssl-to-generate-48-random-hex-numbers-for-beare-token-use.html/feed/atom" thr:count="19" />
			<thr:total>19</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[Convert Word Documents to Markdown for LLM / AI consumptions]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/09/convert-word-documents-to-markdown-for-llm-ai-consumptions.html" />

		<id>https://blog.mypapit.net/?p=2729</id>
		<updated>2026-09-12T10:57:46Z</updated>
		<published>2026-09-12T10:55:05Z</published>
		<category scheme="https://blog.mypapit.net/" term="General" /><category scheme="https://blog.mypapit.net/" term="bash" /><category scheme="https://blog.mypapit.net/" term="debian" /><category scheme="https://blog.mypapit.net/" term="docx" /><category scheme="https://blog.mypapit.net/" term="linux" /><category scheme="https://blog.mypapit.net/" term="LLM" /><category scheme="https://blog.mypapit.net/" term="markdown" /><category scheme="https://blog.mypapit.net/" term="ubuntu" />
		<summary type="html"><![CDATA[<p>I&#8217;ve finally had the time to convert preprint academic articles of JCRINN to markdowns! Microsoft Word documents are common in research, teaching, and administration. When preparing these documents for a large language model (LLM), converting them to Markdown gives you a readable text file that you can inspect, edit, and supply to an AI application. [&#8230;]</p>
<p>The post <a href="https://blog.mypapit.net/2026/09/convert-word-documents-to-markdown-for-llm-ai-consumptions.html">Convert Word Documents to Markdown for LLM / AI consumptions</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/09/convert-word-documents-to-markdown-for-llm-ai-consumptions.html"><![CDATA[
<p class="wp-block-paragraph">I&#8217;ve finally had the time to convert preprint <a href="https://jcrinn.com/article_markdown/">academic articles of JCRINN </a>to markdowns! </p>



<p class="wp-block-paragraph">Microsoft Word documents are common in research, teaching, and administration. When preparing these documents for a large language model (LLM), converting them to Markdown gives you a readable text file that you can inspect, edit, and supply to an AI application.</p>



<p class="wp-block-paragraph">Pandoc is a command-line document converter available on Linux. It supports Microsoft DOCX input and several Markdown formats, making it useful for preparing manuscripts, reports, lecture notes, and technical documentation. Its focus is document structure, rather than reproducing the original page layout. <a href="https://pandoc.org/MANUAL.html">Pandoc documentation</a></p>



<p class="wp-block-paragraph">For academic writing, sections such as Introduction, Methods, Results, and Discussion provide useful boundaries. A retrieval system can divide a document at these boundaries and retrieve relevant passages when answering a question. Microsoft’s Azure AI Search documentation provides a concrete example of indexing Markdown by heading and retaining section information. This supports using Markdown as a practical format for structured retrieval. <a href="https://learn.microsoft.com/en-us/azure/search/search-how-to-index-azure-blob-markdown">Microsoft documentation</a></p>



<p class="wp-block-paragraph">The practical benefits include:</p>



<ul class="wp-block-list">
<li><strong>Visible input:</strong> You can review the actual text supplied to the AI application.</li>



<li><strong>Reusable content:</strong> The same file can support summarisation, question answering, search, and a document knowledge base.</li>



<li><strong>Source tracking:</strong> Keeping the title, authors, DOI, and source URL helps connect extracted claims to their original document.</li>



<li><strong>Controlled selection:</strong> You can provide relevant sections instead of repeatedly submitting the complete document.</li>
</ul>



<p class="wp-block-paragraph">Markdown does not make an LLM automatically understand a document better or prevent invented answers. It also does not necessarily reduce token usage compared with a good DOCX text extractor. File size on disk is not a reliable measure of model input tokens. The benefit is greater control over the text and structure entering your workflow.</p>



<h2 class="wp-block-heading">How to convert DOCX documents to Markdown in Ubuntu / Linux</h2>



<p class="wp-block-paragraph"><strong>Step 1: Install Pandoc</strong></p>



<pre class="wp-block-code"><code>sudo apt install pandoc</code></pre>



<p class="wp-block-paragraph">Ubuntu’s repository version may be older than the latest upstream release. If you need a newer feature or conversion fix, consult the <a href="https://pandoc.org/installing.html">official Pandoc installation instructions</a>. A LaTeX installation is unnecessary for DOCX-to-Markdown conversion.</p>



<p class="wp-block-paragraph"><strong>Step 2 : Convert DOCX to Markdown (single file</strong>)</p>



<pre class="wp-block-code"><code>pandoc "report.docx" --from=docx --to=gfm --wrap=none -o "report.md"</code></pre>



<p class="wp-block-paragraph">For an academic manuscript with footnotes and equations, Pandoc’s own Markdown format is another useful choice:</p>



<pre class="wp-block-code"><code></code></pre>



<p class="wp-block-paragraph">To extract embedded images and update their references:</p>



<pre class="wp-block-code"><code>pandoc "report.docx" --from=docx --to=markdown --wrap=none \
  --extract-media="report-assets" -o "report.md</code></pre>



<p class="wp-block-paragraph">These formats and options are documented in the Pandoc User’s Guide. Running another example with the same output filename replaces the previous Markdown file.</p>



<p class="wp-block-paragraph">An image reference does not give a text-only model access to the image’s contents. Supply figures separately to a vision-capable system, or add verified descriptions and relevant values as text.</p>



<p class="wp-block-paragraph"><strong>Step 3: Review the converted document</strong></p>



<p class="wp-block-paragraph">Compare it with the Word original. Check section headings, numerical results, units, table labels, equations, references, and figure captions. Complex tables and formatting may not survive conversion accurately. <a href="https://pandoc.org/MANUAL.html">Pandoc conversion limitations</a></p>



<p class="wp-block-paragraph">For research documents, retain the qualifications attached to findings. A reported accuracy value without its dataset, evaluation method, or limitations can produce a misleading summary.</p>



<p class="wp-block-paragraph"><strong>Step </strong>4<strong>: Use the Markdown with an LLM</strong></p>



<p class="wp-block-paragraph">Upload the file to an application that accepts Markdown, or paste a relevant section into the conversation. For a larger collection, configure your retrieval workflow to preserve document identity and section headings with each passage.</p>



<p class="wp-block-paragraph">A useful starting prompt is:</p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph">Using only the supplied document, identify the research objective, method, dataset, main results, and limitations. Cite the relevant section for each item. Preserve numerical values and units exactly. If information is absent, state “not reported”.</p>
</blockquote>
</blockquote>



<p class="wp-block-paragraph"><strong>BONUS: Batch convert all DOCX files with bash</strong></p>



<p class="wp-block-paragraph">For a folder containing several documents, save the following script as <code>batch-docx-to-markdown.sh</code></p>



<p class="wp-block-paragraph">The script can be downloaded here in this gist: <a href="https://gist.github.com/mypapit/df6615f8611f03678bc93ee0485001be#file-batch-docx-to-markdown-sh">https://gist.github.com/mypapit/df6615f8611f03678bc93ee0485001be#file-batch-docx-to-markdown-sh</a></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.mypapit.net/2026/09/convert-word-documents-to-markdown-for-llm-ai-consumptions.html">Convert Word Documents to Markdown for LLM / AI consumptions</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/09/convert-word-documents-to-markdown-for-llm-ai-consumptions.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/09/convert-word-documents-to-markdown-for-llm-ai-consumptions.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[How to Generate Audio Spectrum Videos from MP3 songs with FFmpeg]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/08/how-to-generate-audio-spectrum-videos-from-mp3-songs-youtube-ffmpeg.html" />

		<id>https://blog.mypapit.net/?p=2722</id>
		<updated>2026-08-20T04:44:41Z</updated>
		<published>2026-08-20T04:44:40Z</published>
		<category scheme="https://blog.mypapit.net/" term="Bash Scripts" /><category scheme="https://blog.mypapit.net/" term="Computers" /><category scheme="https://blog.mypapit.net/" term="GNU/Linux" /><category scheme="https://blog.mypapit.net/" term="Open Source" /><category scheme="https://blog.mypapit.net/" term="Video / Youtube" /><category scheme="https://blog.mypapit.net/" term="bash" /><category scheme="https://blog.mypapit.net/" term="ffmpeg" /><category scheme="https://blog.mypapit.net/" term="linux" /><category scheme="https://blog.mypapit.net/" term="ubuntu" /><category scheme="https://blog.mypapit.net/" term="video" /><category scheme="https://blog.mypapit.net/" term="youtube" />
		<summary type="html"><![CDATA[<p>Sometimes I need a simple way to convert an MP3 file into a video suitable for YouTube. Instead of using a static image. I created a small Bash script that generates an animated frequency spectrum using FFmpeg. The script uses FFmpeg&#8217;s showfreqs filter to generate an animated frequency spectrum from the audio. How to use [&#8230;]</p>
<p>The post <a href="https://blog.mypapit.net/2026/08/how-to-generate-audio-spectrum-videos-from-mp3-songs-youtube-ffmpeg.html">How to Generate Audio Spectrum Videos from MP3 songs with FFmpeg</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/08/how-to-generate-audio-spectrum-videos-from-mp3-songs-youtube-ffmpeg.html"><![CDATA[
<p class="wp-block-paragraph">Sometimes I need a simple way to convert an MP3 file into a video suitable for YouTube. Instead of using a static image.</p>



<p class="wp-block-paragraph"> I created a small <a href="https://gist.github.com/mypapit/37817eab6988fe05b87c64025409a894#file-spectrum-sh" data-type="link" data-id="https://gist.github.com/mypapit/37817eab6988fe05b87c64025409a894#file-spectrum-sh">Bash script that generates an animated frequency spectrum</a> using <strong>FFmpeg</strong>.</p>



<p class="wp-block-paragraph">The script uses FFmpeg&#8217;s <code>showfreqs</code> filter to generate an animated frequency spectrum from the audio.</p>



<h2 class="wp-block-heading">How to use the script?</h2>



<p class="wp-block-paragraph">Step 1 : Download the script from gist </p>



<pre class="wp-block-code"><code>wget -c https://gist.githubusercontent.com/mypapit/37817eab6988fe05b87c64025409a894/raw/c04a917e12e9b89e6784783d19061dc771dbed99/spectrum.sh</code></pre>



<p class="wp-block-paragraph"><br />Step 2: make it executable  <code>chmod +x spectrum.sh</code><br /></p>



<p class="wp-block-paragraph">Step 3: Use the script &#8211;   <code>./spectrum.sh song.mp3</code><br /><br />Alternatively you can also convert/export multiple mp3 files :   <code>./spectrum.sh *.mp3</code></p>



<h2 class="wp-block-heading">Why Use This Script?</h2>



<p class="wp-block-paragraph">The main advantage is simplicity. There is no video editor, GUI application, or complicated workflow involved. FFmpeg handles the audio analysis, visualization, video encoding, and audio encoding in a single operation.</p>



<p class="wp-block-paragraph">It is also easy to modify the <code>showfreqs</code> parameters if you want different spectrum sizes, positions, frame rates, scaling methods, or visual styles.</p>



<p class="wp-block-paragraph">For batch processing MP3 files into simple spectrum videos, this small Bash script provides a practical solution.</p>



<h2 class="wp-block-heading">Sample Videos</h2>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Henshin Theme - Kamen Rider Black (Cover)" width="1200" height="675" src="https://www.youtube.com/embed/A6iNqcF3MFw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Star Control Shipyard - Remix" width="1200" height="675" src="https://www.youtube.com/embed/VjjBzclD7iQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe loading="lazy" title="Masih Menunggu - (Acoustic Song)" width="1200" height="675" src="https://www.youtube.com/embed/sodncuDivmc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
<p>The post <a href="https://blog.mypapit.net/2026/08/how-to-generate-audio-spectrum-videos-from-mp3-songs-youtube-ffmpeg.html">How to Generate Audio Spectrum Videos from MP3 songs with FFmpeg</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/08/how-to-generate-audio-spectrum-videos-from-mp3-songs-youtube-ffmpeg.html#comments" thr:count="1" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/08/how-to-generate-audio-spectrum-videos-from-mp3-songs-youtube-ffmpeg.html/feed/atom" thr:count="1" />
			<thr:total>1</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[SKILL.md for Researchers and Academicians : academic-article-schema]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/08/skill-md-for-researchers-and-academicians-academic-article-schema.html" />

		<id>https://blog.mypapit.net/?p=2717</id>
		<updated>2026-08-14T12:28:37Z</updated>
		<published>2026-08-14T12:28:35Z</published>
		<category scheme="https://blog.mypapit.net/" term="Git" /><category scheme="https://blog.mypapit.net/" term="Internet Stuff" /><category scheme="https://blog.mypapit.net/" term="Open Source" /><category scheme="https://blog.mypapit.net/" term="Personal Project" /><category scheme="https://blog.mypapit.net/" term="academic papers" /><category scheme="https://blog.mypapit.net/" term="academician" /><category scheme="https://blog.mypapit.net/" term="AI Tools" /><category scheme="https://blog.mypapit.net/" term="article" /><category scheme="https://blog.mypapit.net/" term="ChatGPT" /><category scheme="https://blog.mypapit.net/" term="Claude" /><category scheme="https://blog.mypapit.net/" term="Gemini" /><category scheme="https://blog.mypapit.net/" term="Google Scholar" /><category scheme="https://blog.mypapit.net/" term="JSON-LD" /><category scheme="https://blog.mypapit.net/" term="LLM" /><category scheme="https://blog.mypapit.net/" term="LLM Skill" /><category scheme="https://blog.mypapit.net/" term="metadata" /><category scheme="https://blog.mypapit.net/" term="SKILL.md" /><category scheme="https://blog.mypapit.net/" term="structured data" />
		<summary type="html"><![CDATA[<p>I have completed and released my latest open-source project, academic-article-schema SKILL.md. a reusable LLM Agent Skill designed for researchers, academicians, journal authors, and research developers who have online web profiles. The SKILL.md can be downloaded from academic-article-schema SKILL.md GitHub project page The skill generates structured academic metadata for research articles and datasets for use on [&#8230;]</p>
<p>The post <a href="https://blog.mypapit.net/2026/08/skill-md-for-researchers-and-academicians-academic-article-schema.html">SKILL.md for Researchers and Academicians : academic-article-schema</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/08/skill-md-for-researchers-and-academicians-academic-article-schema.html"><![CDATA[
<p class="wp-block-paragraph">I have completed and released my latest open-source project, <strong>academic-article-schema</strong>  SKILL.md.  a reusable LLM Agent Skill designed for researchers, academicians, journal authors, and research developers who have online web profiles. </p>



<p class="wp-block-paragraph">The SKILL.md can be downloaded from <a href="https://github.com/mypapit/academic-article-schema">academic-article-schema SKILL.md GitHub</a> project page</p>



<p class="wp-block-paragraph">The skill generates structured academic metadata for research articles and datasets for use on their online web profiles.</p>



<p class="wp-block-paragraph"> It can produce Google Scholar <code>citation_*</code> meta tags, Dublin Core metadata, Open Graph tags, and Schema.org <code>ScholarlyArticle</code> and <code>Dataset</code> JSON-LD. It also supports configuration of author details, ORCID, institutional affiliation, publisher information, and dataset links.</p>



<figure class="wp-block-image size-full is-style-default wp-duotone-unset-1"><img loading="lazy" decoding="async" width="955" height="854" src="https://blog.mypapit.net/wp-content/uploads/2026/08/image-1.png" alt="Screenshot of academic-article-schema GitHub page " class="wp-image-2719" srcset="https://blog.mypapit.net/wp-content/uploads/2026/08/image-1.png 955w, https://blog.mypapit.net/wp-content/uploads/2026/08/image-1-768x687.png 768w, https://blog.mypapit.net/wp-content/uploads/2026/08/image-1-468x419.png 468w" sizes="auto, (max-width: 955px) 100vw, 955px" /></figure>



<h2 class="wp-block-heading">Why Academic Publication Metadata on Web Pages Matters ?</h2>



<p class="wp-block-paragraph">Publishing a paper online is not enough. Search engines, academic indexes, reference managers, and AI-based research tools need structured information to correctly identify the title, authors, publication date, DOI, journal, dataset, and other important details.</p>



<p class="wp-block-paragraph">Good metadata can improve the visibility and machine readability of academic publications. It can also help services such as <strong>Google Scholar, Google Dataset Search, Zotero, Mendeley, search engines, and AI research tools</strong> understand the relationship between a research article, its authors, institution, and associated datasets.</p>



<p class="wp-block-paragraph">For academicians, this is important because research visibility affects how easily other researchers can discover, reference, and cite our work.</p>



<h2 class="wp-block-heading">SKILL.md : Reusable LLM Skill</h2>



<p class="wp-block-paragraph">The repository includes a <code>SKILL.md</code>, configurable author defaults, reference material, and example templates. It is designed to be reused across multiple papers instead of rebuilding the same instructions for every project.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="916" height="368" src="https://blog.mypapit.net/wp-content/uploads/2026/08/image-2.png" alt="" class="wp-image-2720" srcset="https://blog.mypapit.net/wp-content/uploads/2026/08/image-2.png 916w, https://blog.mypapit.net/wp-content/uploads/2026/08/image-2-768x309.png 768w, https://blog.mypapit.net/wp-content/uploads/2026/08/image-2-468x188.png 468w" sizes="auto, (max-width: 916px) 100vw, 916px" /></figure>



<p class="wp-block-paragraph">The skill can also be adapted for several LLM and agent environments described in the project documentation, including ChatGPT/Codex, Google Antigravity, Open WebUI, Claude Projects, Cursor, and other coding agents.</p>



<p class="wp-block-paragraph">For researchers who maintain personal academic websites, institutional repositories, research project pages, or dataset pages, this skill provides a practical way to produce more consistent academic metadata with the help of an LLM.</p>



<p class="wp-block-paragraph">The main objective is simple: <strong>make academic publications easier for machines to understand, and therefore easier for people to discover.</strong></p>
<p>The post <a href="https://blog.mypapit.net/2026/08/skill-md-for-researchers-and-academicians-academic-article-schema.html">SKILL.md for Researchers and Academicians : academic-article-schema</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/08/skill-md-for-researchers-and-academicians-academic-article-schema.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/08/skill-md-for-researchers-and-academicians-academic-article-schema.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
		<entry>
		<author>
			<name>Mohammad Hafiz bin Ismail (mypapit)</name>
							<uri>http://mypapit.net/</uri>
						</author>

		<title type="html"><![CDATA[Test Solar PV Monitoring Dashboards Using an Open-Source Renogy BT-1 Simulator]]></title>
		<link rel="alternate" type="text/html" href="https://blog.mypapit.net/2026/07/test-solar-pv-monitoring-dashboards-using-an-open-source-renogy-bt-1-simulator.html" />

		<id>https://blog.mypapit.net/?p=2704</id>
		<updated>2026-07-24T07:01:44Z</updated>
		<published>2026-07-24T06:39:58Z</published>
		<category scheme="https://blog.mypapit.net/" term="General" /><category scheme="https://blog.mypapit.net/" term=".NET" /><category scheme="https://blog.mypapit.net/" term="desktop" /><category scheme="https://blog.mypapit.net/" term="github" /><category scheme="https://blog.mypapit.net/" term="open source" /><category scheme="https://blog.mypapit.net/" term="opensource" /><category scheme="https://blog.mypapit.net/" term="windows" />
		<summary type="html"><![CDATA[<p>Renogy BT-1 telemetry provides useful information for monitoring the condition and performance of a solar photovoltaic system. It can report key values such as PV voltage, current, power generation, battery status, controller temperature, charging activity, and load consumption. These data are important for building dashboards, alerts, databases, and automation systems. However, developing and testing such [&#8230;]</p>
<p>The post <a href="https://blog.mypapit.net/2026/07/test-solar-pv-monitoring-dashboards-using-an-open-source-renogy-bt-1-simulator.html">Test Solar PV Monitoring Dashboards Using an Open-Source Renogy BT-1 Simulator</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></summary>

					<content type="html" xml:base="https://blog.mypapit.net/2026/07/test-solar-pv-monitoring-dashboards-using-an-open-source-renogy-bt-1-simulator.html"><![CDATA[
<p class="wp-block-paragraph">Renogy BT-1 telemetry provides useful information for monitoring the condition and performance of a solar photovoltaic system. It can report key values such as PV voltage, current, power generation, battery status, controller temperature, charging activity, and load consumption. These data are important for building dashboards, alerts, databases, and automation systems.</p>



<p class="wp-block-paragraph">However, developing and testing such a monitoring system normally requires access to real Renogy hardware, including a compatible charge controller and BT-1 Bluetooth module. This can make early development difficult, especially when developers need to reproduce specific conditions such as low battery voltage, peak sunlight, nighttime discharge, or controller inactivity. </p>



<p class="wp-block-paragraph">My latest open-source project, <strong>Renogy BT-1 Telemetry Simulator</strong>, removes this hardware requirement.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1189" height="853" src="https://blog.mypapit.net/wp-content/uploads/2026/07/Screenshot-2026-07-24-144412.png" alt="" class="wp-image-2710" srcset="https://blog.mypapit.net/wp-content/uploads/2026/07/Screenshot-2026-07-24-144412.png 1189w, https://blog.mypapit.net/wp-content/uploads/2026/07/Screenshot-2026-07-24-144412-768x551.png 768w, https://blog.mypapit.net/wp-content/uploads/2026/07/Screenshot-2026-07-24-144412-1024x735.png 1024w, https://blog.mypapit.net/wp-content/uploads/2026/07/Screenshot-2026-07-24-144412-468x336.png 468w" sizes="auto, (max-width: 1189px) 100vw, 1189px" /><figcaption class="wp-element-caption">Application Screenshot</figcaption></figure>



<p class="wp-block-paragraph">The <strong>Renogy BT-1 Telemetry Simulator</strong> addresses this problem by generating realistic sample telemetry and sending it as JSON to an HTTP or HTTPS endpoint without requiring physical solar equipment.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">The simulator imitates telemetry commonly produced by a Renogy BT-1 module connected to a Renogy Rover MPPT charge controller.</p>



<p class="wp-block-paragraph">You can manually configure values such as:</p>



<ul class="wp-block-list">
<li>Solar PV voltage, current, power, and generated energy</li>



<li>Battery percentage, voltage, current, temperature, and battery type</li>



<li>Controller temperature and charging status</li>



<li>Load voltage, current, power, and energy consumption</li>



<li>Controller model, device ID, and BT-1 identifier</li>
</ul>



<p class="wp-block-paragraph">The application can also calculate PV and load power automatically.</p>



<h2 class="wp-block-heading">Renogy BT-1 Telemetry Simulator Use Cases</h2>



<p class="wp-block-paragraph">The simulator is useful for testing the Solar PV under various situations:</p>



<ul class="wp-block-list">
<li>Peak Sunshine</li>



<li>Nighttime operations</li>



<li>Low battery conditions</li>



<li>Heavy loads / light loads</li>
</ul>



<h2 class="wp-block-heading">Application Features</h2>



<ul class="wp-block-list">
<li>One-off HTTP Post transmission</li>



<li>Periodic transmission at a configurable interval</li>



<li>A default two-minute sending interval</li>



<li>Live JSON payload preview</li>



<li>Transmission logs with HTTP status, response, errors, and request duration</li>
</ul>



<p class="wp-block-paragraph">This is useful for testing local development servers, webhooks, staging systems, database storage, monitoring dashboards, and automated alerts before installing physical solar hardware.</p>



<h2 class="wp-block-heading">Requirements</h2>



<p class="wp-block-paragraph">The application uses <strong>WPF and .NET 8</strong>, so it runs on Windows 10 or Windows 11. Developers can build it using Visual Studio 2022 or the standard <code>dotnet</code> command-line tools.</p>



<p class="wp-block-paragraph">The current HTTP client accepts self-signed HTTPS certificates for local testing. This behaviour should not be treated as secure certificate validation for production systems.</p>



<h2 class="wp-block-heading">Download the Source Code</h2>



<p class="wp-block-paragraph">Renogy BT-1 Telemetry Simulator is available on GitHub:</p>



<p class="wp-block-paragraph"><a href="https://github.com/mypapit/renogybt1simulator">github.com/mypapit/renogybt1simulator</a></p>



<p class="wp-block-paragraph">The project is released under the <strong>GNU General Public License version 3</strong>, allowing users to study, modify, and redistribute the source code according to the GPL terms.</p>



<p class="wp-block-paragraph">This project is an independent simulator and is not an official Renogy product.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://blog.mypapit.net/2026/07/test-solar-pv-monitoring-dashboards-using-an-open-source-renogy-bt-1-simulator.html">Test Solar PV Monitoring Dashboards Using an Open-Source Renogy BT-1 Simulator</a> appeared first on <a href="https://blog.mypapit.net">mypapit  gnu/linux </a>.</p>
]]></content>
		
					<link rel="replies" type="text/html" href="https://blog.mypapit.net/2026/07/test-solar-pv-monitoring-dashboards-using-an-open-source-renogy-bt-1-simulator.html#comments" thr:count="0" />
			<link rel="replies" type="application/atom+xml" href="https://blog.mypapit.net/2026/07/test-solar-pv-monitoring-dashboards-using-an-open-source-renogy-bt-1-simulator.html/feed/atom" thr:count="0" />
			<thr:total>0</thr:total>
			</entry>
	</feed>
