QetriX

About QetriX

QetriX is a paradigm for creating apps, websites, and games.

We implemented the paradigm into an open-source QetriX Framework, available for various languages, platforms, and frameworks. QetriX is opinionated, and we used the same coding style across platforms wherever possible.

Component structureWith the QetriX Framework, you build apps in a just-enough and low-effort manner, using as few as four types of components: QElem, QForm, QList, and QView. Components transform data received from services into a particular representation, defined by converters.

The QetriX App consists of modules, which are called by a path or URL via routing middleware. The module generates a page with either text-based content (like HTML, CSV, or JSON – depending on the selected converter) or a component, converted to an appropriate output format by the Framework.

Diagram of QetriX request and response processingPage inspects the incoming request to determine the response format and language, parses the URL, and loads the appropriate Module.

Module loads data from Services and passes it to its Components, which are then converted into the target format (HTML, XML, JSON, etc.), returned as a response. While the Page is universal, each Module is designed for its particular purpose.

The Framework is robust and powerful, yet fairly simple, performant, and lightweight. We have used it for enough projects to know it provides everything you need for your projects as well. Converter classes are designed to be standalone, so you can use them in your project.

Products

Many of our products are interconnected and extend each other.

Platforms

QetriX based

Qedy based

Qard based

Internals

Showcase

Examples

Code examples of various parts in a QetriX App, where we try to show Framework's single coding style across different programming languages and their variants.

Note: We use our custom Dict class (basically a HashMap or Assoc. Array) for passing arguments into methods.

Page in Java

public class PageInJava extends QModule
{
public String main(Dict args)
{
var view = new QView();
view.label("Page in Java");
view.add("This is a HTML page in Java.");
return view.convert("page");
}
}

Table in PHP

class TableInPHP extends QModule
{
public function table(Dict $args)
{
$tbl = new QList();
$tbl->label("Table in PHP");
$tbl->add(QElem::create(ElemType::number, "id", "ID");
$tbl->add(QElem::create(ElemType::text, "name", "Name");
$tbl->data($this->ds()->getTableData());
return $tbl->convert("table");
}
}

Form in C#

public class FormInCS : QModule
{
public String form(Dict args)
{
var frm = new QForm();
frm.heading("Form in C#");
frm.action("formSubmit");
frm.add(new QElem(ElemType.text, "email", "E-mail", "", 10));
frm.add((new QElem(ElemType.button)).action("validate"));
frm.add(new QElemButton("Submit"));
return frm.convert();
}
}

Module in JavaScript

class Person extends QModule
{
const _data = {};

main(args) // Default method for every Module
{
_data.name = args.get("name");
}

get name()
{
return _data.name;
}
};

Module in ECMAScript 5

Older version of JavaScript, compatible with Internet Explorer 9

com.qetrix.modules.Person = function($QModule) // $QModule contains QModule methods
{
var _data = {};

$public.main = function (args) // Default method for every Module
{
_data.name = args.get("name");
}

$public.name = function (args)
{
return _data.name;
}

return $public;
};

Navigation in Python

class NavInPython(QModule):
def nav()
nav = QList("nav");
nav.add({"text":"First", "action":"first.html"});
nav.add({"text":"Second", "action":"second.html"});
nav.add({"text":"third", "action":"third.html"});
nav.actionBase(self.page().pathBase());
nav.value(self.page().path());
return nav.convert();

SQL Service method in Ruby

class RubyOracleDs < QService
def self.getTableData()
return self.get("SELECT a, b, c FROM ".self.prefix()."qtable WHERE d = 1 ORDER BY a, b DESC");
end
end

Form in JSON for Qedy

{
"qform": "",
"name": "form",
"label": "Form for Qedy",
"add": [,
{"qelem": "text", "name": "email"},
{"qelem": "button", "action": "formSubmit"},
]
}

Converter in Kotlin

fun QList_Xml(list: QList): String {
val sb = StringBuilder()
sb.append("<").append(qlist.name()).append(">")
// ...
sb.append("</").append(qlist.name()).append(">")
return sb.toString();
}

Module in Swift

func swiftMod(args: Dict) -> String {
let str = "It works!"
return str
}

SQL Service method in Node.js

class NodeHttpDs extends QService
def self.getTableData()
return self.get("SELECT a, b, c FROM ".self.prefix()."table WHERE c = 1 ORDER BY a, b DESC");
end
end

Form in TypeScript

class FormInTS extends QModule
{
public form(Dict args): string
{
var frm = new QForm("form");
frm.heading("Form in TypeScript");
frm.add(new QElem(ElemType.text, "email", "E-mail", "", 10));
frm.add((new QElem(ElemType.button)).action(formSubmit));
return frm.convert();
}

function formSubmit() { ... }
}

Module in Q

qview:page heading:Module in Que
#1.add Lorem ipsum dolor sit amet
qform:search
#3.add:text
#3.add:button
#1.add #3
#1.convert html page

SQL Service method in Rust

fn rustmssqlds(x: Dict) -> string
{
def self.getTableData()
return self.get("SELECT a, b, c FROM ".self.prefix()."table WHERE c = 1 ORDER BY a, b DESC");
}

Converter in Go

func QList_Json(list QList) string
{
var buffer bytes.Buffer
buffer.WriteString("{")
// ...
buffer.WriteString("}")
return buffer.String();
}

Form in React/JSX

return (
<QForm label="Form for Qedy" action={submitAction}>
<QElemText name="name" label="Name" />
<QElemEmail name="email" label="E-mail" />
<QElemButton text="Validate" action={() => true} />
<QElem elem="button" text="Submit" />
</QForm>
)

Navigation in Lua

function NavInLua(args)
local nav = QList:create()
nav.data(this.ds().nav()); // Load data from e.g. database
nav.actionBase(this.page().pathBase());
nav.value(this.page().path());
return nav:convert()
end

Particle structure in MySQL

CREATE TABLE `p` (
`p` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'Primary Key (ID)',
`pp` INT(10) UNSIGNED NOT NULL COMMENT 'Entity (p.p of a parent Particle)',
`pt` INT(10) UNSIGNED NOT NULL COMMENT 'Type, Category or Classification (t.t)',
`pv` VARCHAR(200) NULL DEFAULT NULL COMMENT 'Value' COLLATE 'utf8mb4_unicode_ci',
`pr` INT(10) UNSIGNED NULL DEFAULT NULL COMMENT 'Relation (p.p of a foreign Particle)',
`ps` INT(10) NOT NULL DEFAULT '0' COMMENT 'Sort order, significance',
PRIMARY KEY (`p`),
INDEX `pt` (`pt`),
INDEX `pp` (`pp`),
INDEX `pr` (`pr`)
)
CHARSET=utf8mb4 COLLATE='utf8mb4_unicode_ci';

Particle data in JSON

{
"p": 24,
"pp": 24,
"pt": 7,
"pv": "QetriX",
"ps": 999
}

Downloads

  • QetriX.dll: Class Library for .NET Standard 2.0 (ZIP, 21 kB, 2018-12-31, MD5: 171335f066f2977d052ff5c61f2a4033)
  • QPage.php: QPage for PHP 7+ (ZIP, 9 kB, 2020-12-22, MD5: 6fc2eebe74a191be1ddfd313e5b7000c)

You can get source code for different languages on GitHub.

History

2025

  • Qard improvements

2024

  • Quid shipped to new customers.
  • 07.05. Qip on Quiky.net up and running.
  • 25.09. DAV with extensions for Qik.
  • 05.11. QetriX integrated with Java Spring Boot.

2023

  • 13.04. Qard greatly enhanced and integrated with QetriX.
  • 12.05. Interactive floorplans added to Qik.

2022

  • 29.01. Quid finalized.

2021

  • 10.01. Quac enhanced, added add-ons.
  • 04.06. JavaScript Framework Mk. IV released.
  • 20.12. Qard released.

2020

  • 30.01. JavaScript Framework Mk. III released.
  • 16.06. Lite version of Framework improved.
  • 15.07. JavaScript Framework Mk. III enhanced.
  • 18.11. JavaScript Framework for Node.js released.
  • 17.12. Quac enhanced, added plugins for Qip and Quo.

2019

  • 01.03. JavaScript Framework Mk. II released.
  • 13.05. Qedy Client Mk. II released..
  • 27.09. JavaScript Framework Mk. II enhanced.
  • 25.11. Lite version of Framework released.
  • 01.12. QetriX Blog was reborn.
  • 30.12. Quac released.

2018

  • 18.01. Quid released.
  • 30.04. Qedy and Framework greatly enhanced.
  • 12.07. Framework in JavaScript with UI extension released.
  • 07.09. Framework in .NET Standard 2.0 released.
  • 14.12. Quac conceived.
  • 25.12. Qard and Qip conceived.

2017

  • 13.01. Qedy Server Mk. II released.
    • Layouter,
    • Processes with Actions between States.
  • 21.02. Qui became independent app inside Quid.
  • 27.09. Qik conceived.

2016

  • 18.03. Quo conceived (as “Qua”).
  • 21.03. Framework Mk. VI released.
    • Dict,
    • QPage instead of QApp,
    • QElem instead of QType and QListCol,
    • QItem instead of QListRow.
  • 01.08. Qedy conceived.

2015

  • 22.04. Quly conceived.
  • 31.03. Quid conceived.
  • 11.01. Qarate conceived.

2014

  • 31.12. Mravenci (Ants), running on cross platform QWebApp, released.
  • 16.12. Framework Mk. V released.
    • Renderers replaced by converters,
    • multiplatform coding standards.
  • 22.04. Quiky for iOS released.
  • 06.04. Quiky for Windows reengineered.
    • WPF instead of WinForms,
    • using .NET Framework 4.0.
  • 20.01. Framework Mk. IV released.
    • Modules instead of plugins,
    • components introduced,
    • renderers introduced.

2013

  • Quiky conceived.
  • G-Particle introduced with GeoEdit.
  • QB offers personal semantic databases.
  • Framework Mk. III released.
  • 06.02. QetriX Blog started.
  • QB Mk. II released.

2012

  • QetriX got a logo.
  • Framework Mk. II released.

2011

  • 25.05. QB released.
  • 17.02. QB reengineered.
  • 01.02. QetriX name developed.
    • QeX (03/1999) → Q3X (leet) → Q-tri-X = QetriX

2010

  • 24.07. QB conceived.

2009

  • 19.11. Data Particle was invented and QPDB was born.
  • 21.08. Kilopedia shut down.
    • Articles were unsustainable, so we kept structured data only, which changed the concept.
  • 08.01. Kilopedia received a geographical extension.

2008

  • 21.08. Kilopedia moved to its own domain.

2007

  • 24.11. Kilopedia released.
    • Mobile encyclopedia with short articles up to 1024 B per language,
    • each category has its own dataset for structured data.
  • 14.10. Q3X App Beta released.
    • Single .exe, compatible with both Windows Mobile 2003 and Windows XP,
    • web app with the same service and using the same XML files.
    • Used .NET Compact Framework 2.0 and PHP 5.2.
  • 10.04. Q3X App Proof-Of-Concept, with XML Form and XML Data definitions.

2003

  • QeX Mk. IV released.

2001

  • 30.11. QeX moved to its own domain.
  • 15.08. QeX conceived as extended internet forum.

Contact

Social networks

Stay Tuned