PHPSQLitejQueryOpen Source
Scientia potentia est — knowledge is power, and power dispersed among the many is power distrusted by none. This platform is offered in that spirit: a small, unglamorous machine built for a large, unglamorous purpose — helping to educate the life of the world's people, one verified article at a time.
Every legal system worth its salt rests on the presumption that citizens may know the law under which they live — ignorantia juris non excusat, ignorance of the law excuses no one, but that maxim only holds water if knowledge is actually within reach. The same logic, we'd argue, extends well beyond statute books. A society's capacity to reason, to vote sensibly, to bargain fairly in the marketplace, and to hold power to account, rests on a shared, freely accessible stock of reliable information. That is the modest, slightly grandiose ambition behind this CMS: a lightweight, self-hosted, Wikipedia-flavoured knowledge portal that any individual, NGO, newsroom, campus, or local council can stand up on ordinary shared hosting, in their own language, under their own editorial rules.
Sociologically speaking, knowledge portals of this kind function as what Habermas would call a small public sphere — a space where claims can be made, challenged, revised, and eventually settled by something resembling consensus rather than by decree. Economically, the marginal cost of one more reader accessing one more verified fact is close to zero, which is precisely the argument for keeping the gate as open as is responsible. Philosophically, we rather like Bacon's old adage restated above: scientia potentia est. Knowledge, once shared, ceases to be anyone's private property and becomes, rather wonderfully, everyone's.
All that said — let's not get too big for our boots. It's a PHP and SQLite content management system. Nothing more mystical than that. Right, let's get you installed.
/wiki/your-article-title) — no visitor ever sees a raw filename.| Role | Can do |
|---|---|
| Super Admin | Absolutely everything below, plus: query the SQLite database directly from the dashboard, rename the site, change its tagline and logo, switch the colour theme, change language and timezone, move the site's URL/path, temporarily suspend the whole site (maintenance mode), and create/suspend/delete Admin, Editor, and Author accounts. |
| Admin | Everything an Editor and Author can do, plus create, suspend, and delete Editor and Author accounts, and issue/revoke API keys. |
| Editor | Edit, approve, reject, or delete any Author's submission; leave revision notes that open a direct line of communication with the Author for the purposes of revision. |
| Author | Submit new entries; edit or delete their own work at any time — even after an Editor has already approved it. Pacta sunt servanda doesn't apply to a manuscript; the author's right of final say over their own words persists. |
The golden rule enforced throughout the code is delightfully old-fashioned: nemo dat quod non habet — no one can give what they do not have. A role may only ever create accounts strictly beneath its own level. An Admin cannot mint a fellow Admin; a Super Admin remains, by design, one of a kind (though nothing stops you creating a second one from the database if you're feeling brave).
chmod -R 755 is typically sufficient; the installer will create its own SQLite storage folder).https://yourdomain.com/install.php in your browser.config.php, builds the SQLite schema, and creates your Super Admin account. You'll be redirected straight into the dashboard — and install.php deletes itself automatically the moment setup succeeds, so there's nothing left over to lock down or remember to remove. (If your hosting environment doesn't allow a script to delete itself, it will simply refuse to run again next time — either way, it's covered.)Server requirements are deliberately modest: PHP 8.0+ with the pdo_sqlite extension (present on almost any shared host by default), and mod_rewrite enabled for the .htaccess file to do its work. No Composer, no Node build step, no database server to provision. Res ipsa loquitur — the whole point is that it should just work.
Log in at /admin/ (or whatever you renamed that folder to), choose Articles → New article, and write away using the toolbar (bold, italic, underline, a handful of special characters, and inline images). Fill in the excerpt, cover caption, meta description, and meta keywords before saving — these feed directly into search-engine snippets and social-media previews. Submitting sends your work to pending review; approved work can still be revisited and amended whenever you like.
Pending review lists everything awaiting your eye. Open an entry to edit it directly, leave a note explaining what needs work (the Author will see it beside the article), or approve/reject outright.
Accounts lets you create new users at any role beneath your own, and suspend or permanently delete existing ones. API keys is where outside integrations are managed (see §6). The Super Admin alone additionally sees Settings (site identity, theme, language, timezone, maintenance mode, SMTP) and Database — a direct SQL console onto the live SQLite file. Use it as you would a scalpel: precisely, and only when you mean to.
Interface strings are bundled for: English (British and US), Bahasa Indonesia, Basa Jawa Krama, Basa Sunda, Spanish (Spain and Mexico), French, Italian, German, Afrikaans, Arabic, Mandarin Chinese, Japanese, Korean, Portuguese, Turkish, Hindi, Russian, and Slovenian. Missing strings in any file fall back gracefully to British English, so a partially translated locale never shows a blank space — only, at worst, an English word amid its neighbours, which is a good deal better than a broken page. Timezones covering all of the above regions are pre-loaded in Settings.
Only Admins and the Super Admin may generate or revoke an API key (dashboard → API keys). Once you have one, any other website can pull your latest approved entries by pasting the following near the top of its own index.php:
<?php
$inkrahApiKey = 'YOUR_KEY_HERE';
$inkrahEndpoint = 'https://yourdomain.com/api/index.php?action=latest_articles';
$ch = curl_init($inkrahEndpoint);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['X-API-Key: ' . $inkrahApiKey]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
foreach ($response['data'] ?? [] as $article) {
echo '<h3><a href="' . htmlspecialchars($article['url']) . '">'
. htmlspecialchars($article['title']) . '</a></h3>';
}
A revoked key stops working immediately; there is no grandfathering. Caveat lector — treat the key like a password, because functionally, that's exactly what it is.
password_hash() (bcrypt); nothing is ever stored in the clear.HttpOnly and SameSite=Lax; CSRF tokens guard every state-changing form..htaccess denies direct access to config.php and to any raw .sql/.sqlite file, and funnels every other request through a single front controller so real file and folder names are never exposed to a visitor.No system is bulletproof, and anyone who tells you otherwise is selling something. Keep PHP and your web server patched, take regular backups of your SQLite file, and you'll be in good shape.
This is an open-source project: INKRAH Web Design Open Source Project for Wiki Portal. You are warmly invited to install it, adapt it, and put it to work. The one thing we ask — and, candidly, the one thing the code itself is built not to let you quietly remove — is the footer credit and the watermark comments embedded in every file:
Powered by INKRAH.com · Developed by INKRAH Web Design
+62.8111345777 · webmaster@inkrah.com
Fair's fair, as we'd say back home — the tool's free, the credit line isn't up for negotiation. That's the whole deal, and it's not a bad one.
Powered by INKRAH.com · Developed by INKRAH Web Design
INKRAH Web Design Open Source Project for Wiki Portal · +62.8111345777 · webmaster@inkrah.com