Software that runs where the data already is.

EchoVale Technologies builds educational and reference software for Android. Our work shares one constraint: the computation happens on the device in your hand, not on a machine we own. It makes the apps faster, it makes them work on a train, and it means there is no copy of your work anywhere we could be asked to hand over.

> SELECT principle, position FROM engineering;

Four positions, settled

Decided once so that they do not have to be re-argued every time a feature request arrives.

4 rows returned
principleposition
on_device The computation belongs on the user's hardware. A real database engine fits in a mobile app; there is rarely a technical reason to send someone's work to a server, only a commercial one.
no_accounts A registration screen between a person and the thing they opened the app to do is a tax we are not willing to charge. If a feature genuinely requires identity, it can wait until it does.
real_not_simulated Teaching software that fakes its subject teaches the fake. Our SQL app runs an actual engine against actual tables, so the syntax that works in the app is the syntax that works at a job.
permission_debt Every access request in the manifest is reviewed as a line item before each submission. Anything we cannot justify in one plain sentence gets removed along with the feature that wanted it.

> SELECT * FROM releases WHERE status = 'live';

Queryforge

A full SQL course and a free-form sandbox in one app, running a genuine database on the phone.

Queryforge

com.tablesmith.queryforge

Fifteen structured lessons take you from a first SELECT through WHERE, ORDER BY, JOINs, GROUP BY, aggregates and subqueries. Each one gives a plain-language explanation and a task: read it, write the query, run it, and the app compares your result against the expected answer. Wrong answers are not punished — you keep tinkering until the rows come back right.

SELECT c.name, COUNT(o.id) AS orders FROM customers c JOIN orders o ON o.customer_id = c.id GROUP BY c.name ORDER BY orders DESC;

Alongside the course sits a sandbox where any query runs freely against the sample tables, a schema browser showing every column and foreign key, and a searchable syntax reference. The training database ships with the app:

customers   id INTEGER · name TEXT · city TEXT · signup_date TEXT
products    id INTEGER · name TEXT · category TEXT · price REAL
orders      id INTEGER · customer_id → customers.id · status TEXT
order_items id INTEGER · order_id → orders.id · quantity INTEGER
→  privacy policy

> SELECT stage, detail FROM method ORDER BY step;

How a release happens

Five stages. In practice the middle three repeat until the thing stops being irritating to use.

5 rows returned
stagedetail
irritationEvery project begins as one specific complaint about an existing tool, written in a single sentence. If the sentence cannot be written, there is no project.
outlineFor teaching software, the curriculum comes before the interface. We write the lesson order and the tasks first, because a beautiful app around a badly ordered course teaches badly.
thin_sliceThe smallest version that works end to end, installed on a real phone and used daily for a week. Most proposed features die at this stage, which is the purpose of the stage.
subtractionA pass whose only goal is removal — settings nobody changed, screens nobody opened, animation that was amusing exactly once.
ship_and_readRelease, then read every message that arrives. The roadmap below is largely other people's irritations, collected patiently.

> SELECT layer, choice FROM stack;

What it is built from

Deliberately unfashionable choices. Boring technology has documentation, and documentation is what you need at eleven at night.

6 rows returned
layerchoice
languageKotlin, against current stable Android APIs, with no cross-platform layer between the code and the device.
interfaceJetpack Compose, using standard components wherever they fit and custom drawing only where the content genuinely needs it.
databaseA real embedded SQL engine bundled inside the app, running your queries locally. The sample tables ship with the binary.
networkNone. There is no API to call, no endpoint to keep alive, and no outage that could take the app down.
permissionsNone requested at runtime in the current release. Re-checked as a line item before each submission.
distributionGoogle Play, one release channel. No beta maze, no side-loaded builds.

> SELECT item, state FROM roadmap WHERE shipped = false;

Not finished yet

Nothing here carries a promised date. It moves when it is ready, and occasionally it moves to the bin instead.

4 rows returned
itemstate
window_functionsA lesson block covering ROW_NUMBER, RANK and running totals. Written, not yet built into the course order.
query_historyA local record of queries you have run in the sandbox, so a good one is not lost when you close the screen. In build.
own_datasetImporting your own small CSV into the sandbox to practise against data you care about. Under consideration; the file-access cost has to justify itself.
second_titleEarly notes on a second reference app in a different subject. Nothing decided and nothing announced.

> SELECT question, answer FROM support;

Asked often enough

Is the SQL engine real, or a simulation?

Real. Queryforge bundles an actual embedded SQL database and executes what you type against it. Syntax errors come from the engine, not from a script comparing your text to an expected string, which is why the error messages are useful.

Does the app need an internet connection?

No. The database, the lessons, the reference and the checker all ship inside the app. It works in aeroplane mode and on the underground.

How does it check my answer if there are several correct queries?

It compares the result your query returns against the expected result, not the text of the query. Any query that produces the right rows passes, which is the same standard a real database applies.

Where is my progress stored?

In the app's private storage on your own device. It is not uploaded anywhere, which also means it does not follow you to a new phone.

Can I run destructive statements in the sandbox?

The sample tables live inside the app, so nothing you do there can affect anything outside it. If you break the training data, resetting the app's storage restores it.

Which SQL dialect am I learning?

The core of the language — SELECT, filtering, joins, grouping, subqueries — is common across every major database. Dialect-specific edges exist, and where a lesson touches one, it says so.

Are there ads or in-app purchases?

Neither, in the current release. If that ever changes, the privacy policy is updated before the release goes out, not after.

How do I report a bug?

Email us with your device model, Android version and the query that misbehaved. That trio usually cuts a day off finding the cause.

> SELECT * FROM company;

Contact and registration

Support requests, bug reports, press enquiries and anything covered by the privacy policy go to one address, read by the people who write the code. We reply within five working days.

contact@renyuan.guru
RENYUAN LIMITED
trading as EchoVale Technologies
Registered in England and Wales
Director: Shizhao Wang

Unit 2B, Market Walk
Salisbury SP1 1BT
United Kingdom
© 2026 RENYUAN LIMITED — all rights reserved Queryforge privacy policy