Learning and practice game for keyboard navigation
Translation of the German guide. The app interface is in German; key on-screen labels are kept in German below.
Version 1.7 · As of: 23 August 2026
Note: This English guide is a translation of the German game guide. The app's user interface is in German; where a specific on-screen label matters, the German wording is kept (e.g. the buttons
NEU,SIM,Ok).
flinqe finga trains fast and precise navigation on virtual keyboards. The goal is to type a given word with as few cursor movements as possible and as quickly as possible.
The cursor starts at a fixed position. Use the control pad to move it to the target key and confirm with ✓. Repeat this until the word is fully entered.
+------------------------------------------+
| flinqe finga 12:34:56 = | <- Header (compact)
| Player name |
+------------------------------------------+
| 05 * L2 * Mittel Description i | <- Level row: keyboard-no. . L# . name + description
| |
| H A L L O | <- Target-word tiles
| |
| [ ... virtual keyboard ... ] | <- Keyboard with red cursor
| |
| [ Input: h a _ ] | <- Input line
| |
| 00:12.34 * 8 moves | <- Stopwatch + move count (top)
| [NEU] Best time: 7.77 s * 8 mv [SIM] | <- Best-time bar (below) - share the row
| |
| /\ |
| < Ok > | <- Control pad
| \/ |
+------------------------------------------+
| hello world it is me | <- Marquee with the target phrase
| Opt: 14 (*) | <- Status: Opt value left, optional hint
+------------------------------------------+Level row: Shows keyboard-no. · L# · name in the badge with the description next to it (e.g. “01 · L3 · Mittel”). The keyboard name is shown in short form — the Tastatur_ prefix is dropped; Tastatur_001 becomes “01”, Tastatur_009 becomes “09”, Tastatur_101_ger becomes “101”. If the level name is just a number (“L1”), it isn’t shown twice. Tapping opens an info dialog with keyboard number, keyboard description, level number and level description (10-second auto-close timer). On keyboards with fewer rows the row text grows automatically (≤ 4 rows ≈ 30 % larger).
Stopwatch + best-time bar: The stopwatch (with move counter) and your personal best for the current phrase share the height of the NEU button. If no best time exists yet, the stopwatch stands alone in the centre.
Footer row 1 (yellow, scrolling): The target phrase as a marquee.
Footer row 2: Opt: N shows the optimal number of moves for the current phrase. If (*) follows, the optimal solution can only be reached with the help of the cursor keys ◀/▶ — these phrases are especially interesting for advanced players (see “cursor strategy” below). During game events (“undo”, “simulation running”, “time’s up”) a short hint appears to the right of the Opt value.
Wraparound is always active — at the edge the cursor jumps to the opposite side.
| Key | Function |
|---|---|
Arrow keys | Move the cursor on the keyboard |
Enter | Press the highlighted key |
Numpad 8 2 4 6 | Move the cursor (alternative) |
Numpad 5 | Press the key (alternative) |
| Gesture | Function |
|---|---|
| Tap the arrow buttons | Move the cursor on the keyboard |
| Tap Ok / check mark | Press the highlighted key |
| Tap <- | Undo the last cursor movement |
| Swipe left/right on the keyboard | Load the next / previous layout |
| Swipe up/down on the keyboard | Make the grid brighter / darker |
When diagonal navigation is enabled, a 3×3 control pad appears with 4 additional diagonal keys (on all keyboards, regardless of their shape):
diagonal-up-left up diagonal-up-right
left Ok right
diagonal-down-left down diagonal-down-rightAfter opening the app, a random target word appears. The timer is stopped – the first movement starts it.
Navigate to the desired key with the control pad and confirm with Ok. The game automatically detects when the input matches the target word.
| Symbol | Function |
|---|---|
BackSpace | Delete the last character |
Del | Delete the character at the cursor position |
Enter | Confirm the input |
Space | Insert a space |
Shift | Shift (single uppercase letter) |
CapsLock | Caps Lock (permanent uppercase) |
left right | Move the text cursor within the input line |
The left/right keys on the keyboard move the text input cursor. This lets you insert letters in any order. Example for the word “BRIEFE”: type R, I, E, F, E first, then press left several times to insert the B at the start. On certain keyboard layouts this saves many moves.
On correct input the completion overlay appears with score, time and moves. From there:
If a level has a time limit and the time runs out, “TIME UP” appears. Again starts a new attempt.
The time limit adapts to the difficulty of the phrase: the longer the optimal solution, the more time you get (but at least the level base time). This keeps even a difficult phrase fairly solvable. The simulation (optimal path, SIM) always runs through completely without a time limit — it shows the solution and never fails because of the clock.
Score = 10,000 - (moves x 10) - (time in ms / 200)Minimum value: 0 points (the score never goes negative).
| Factor | Effect | Tip |
|---|---|---|
| Moves | -10 points per cursor movement | Find the most direct paths |
| Time | -1 point per 200 ms | Type briskly, don't hesitate |
Example: word in 25 moves and 18 seconds: 10,000 - 250 - 90 = 9,660 points
Moves are more costly than time: 5 extra moves cost 50 points; 5 extra seconds cost 25 points.
The overlay also shows the deviation from the theoretical optimum (+N = N moves more than optimal). The optimal number of moves is calculated automatically.
For each combination (keyboard, rule set, phrase, diagonal, mode) the game stores exactly one entry — the best result. A new attempt automatically overwrites the old entry if it is better. In the completion overlay a golden NEW HIGH SCORE banner appears when you set a new record.
High scores are ranked separately for one-handed and two-handed play:
If you mostly play one-handed, you can specifically improve your own one-handed best results.
Phrases with a (*) star are those whose optimal solution uses the text cursor (◀/▶ on the keyboard). They are technically more demanding and interesting for advanced players.
High scores in the menu opens the high-score screen with three tabs. All tabs show the entries in the same card layout.
You can recognise the two online tabs by the globe symbol with an extra symbol: 🌐+filter = filtered to the current combination, 🌐+up/down arrows = all entries in order.
Tab “Online” (globe + filter — current combination):
Tab “Online” (globe + arrows — all entries):
Tab “Mine” (local entries):
“Mine” and “Online” are separate lists: “Mine” is your personal archive (it stays even if others are better online), “Online” shows only the respective rank-1 holder. A synchronisation never deletes local entries.
If the server is currently unreachable, the score is cached in an offline queue. The next time the app starts with a connection, these entries are submitted automatically — a short message (“N offline high scores synchronised”) confirms the sync. The server decides per entry whether it beats the current best result.
The operator can send messages to you individually or to all players (e.g. notes about new versions, replies to your questions). On the next app start, a dialog appears with subject, body and a reply field (max. 100 characters). Tapping “Verstanden” marks the message as read on the server and stores your reply. Each message is shown to each player only once.
If you get a new phone, or want your name changed, you can carry your account over without losing your place on the leaderboard:
As protection against misuse, a foreign name cannot simply be taken over — the approval is done by the operator.
The player settings contain an entry “Lokale Highscores hochladen” below the online-account block. It pushes all of your locally stored “Meine” high scores to the server in one go. The server only accepts entries that are better than what is already there (or that are still missing) — no local data is changed. Useful after a server data loss or after a device change, when you still have your local bests but the server doesn’t.
Each high-score entry contains:
| Field | Meaning |
|---|---|
| Target word | The typed word / phrase |
| Keyboard ID | Which layout was used |
| Navigation mode | Rule set (Rs01 / Rs02) |
| Diagonal | Was diagonal navigation active? |
| Mode | One-handed / two-handed (from the control-pad position) |
| Cursor path | Was the (*) trick optimal? |
| Moves / time / score | Core values |
| Optimal moves | Theoretical minimum |
| Player name | Local name |
| Build number | App version |
Note: Wraparound is always active — high scores are therefore comparable across all games.
Open via menu icon → Settings.
Local display name (max. 30 characters). Appears in the game header. High scores are only saved if a name is entered. Blocked terms are rejected during online registration.
Selection of the active keyboard and level. Optionally: include your own keyboard file via Load keyboard file.
With auto-layout switched on the app ignores the system font scaling from the Android accessibility settings and uses its own, device-independent defaults. The game then looks the same on every handset without you having to fine-tune anything per device.
While auto-layout is active the following size sliders are hidden entirely (key font, secondary-label font, max. font enlargement, scale key font to key height, target-tile size). Only after turning auto-layout off do they reappear and become individually adjustable.
| Setting | Function |
|---|---|
| Key font size | Global font-size multiplier (50–200 %) |
| Secondary-label font size | Size of the Shift labels on the keys (50–200 %) |
| Max. font enlargement (system) | Upper limit for the system font size (Android accessibility) |
| Scale key font to key height | Per-key font scaled proportionally to the rendered key height |
| Target-tile size | Size of the target-word tiles (16–44 px); font scales with it |
Max. font enlargement (system): Android has its own font-size setting in the accessibility options. flinqe finga adopts it so the app scales up/down with it. Very high system levels can however make the layout overflow. With this slider you set how much the app font may be enlarged at most — in 10 steps from ×1.30 to ×1.75 (default ×1.75). Lower = definitely no overflow; higher = larger font, but at very high system levels it can get tight. The lower limit is fixed so the font never becomes unreadably small.
In the player settings under Appearance you’ll find three colour pickers, each tinting a whole UI area:
#00BCD4.#00BCD4.#E94560.Each picker opens when you tap the corresponding colour swatch. Changes take effect immediately, no restart needed.
Controls how the cursor jumps at line boundaries when pressing arrow-up/-down.
Diagonal navigation: enables the four diagonal directions ↖↗↙↘; the control pad then becomes a 3×3 grid. With and without diagonal, separate high scores are kept.
| Setting | Function |
|---|---|
| Sound | Acknowledge direction keys with a tone |
| Sound volume | Slider 0–100 % |
| Vibration | Acknowledge direction keys with vibration |
| Key click | Acknowledge the Ok key with a click sound |
| Click volume | Slider 0–100 % |
| Intro sound | Play the voice announcement on app start |
| Vibration intensity | Light / medium / strong |
| Mode | Description |
|---|---|
| One-handed left | Control pad at the left edge |
| Two-handed | Control pad centred (default) |
| One-handed right | Control pad at the right edge |
| Setting | Function |
|---|---|
| NEU button | Show the quick-restart button next to the timer |
| Undo button | Undo the last cursor movement (button next to the control pad) |
| Highlight next key | Marks the key to be typed next in green. This is only a guide to the next character in word order — not necessarily the path that needs the fewest moves (see the “i” in the settings) |
| Highlight optimal next key | Marks the next key on the optimal (fewest-moves) solution path in pink — i.e. the next step pressed by the solver or the pre-computed path. This may be in a different order or a ◀ ▶ cursor key. Follow this marking for the best score |
| Auto-advance | Advance automatically after completing a level (0 = off, 1–15 sec.) |
Swipe left or right on the keyboard to switch between the available layouts.
Keyboards & levels opens the level-selection screen with all keyboards and levels.
| ID | Description |
|---|---|
| tastatur_001 | Standard QWERTZ |
| tastatur_002 | QWERTZ extended (Del key, more special characters) |
| tastatur_003 | Compact layout without number row |
| tastatur_004 | Compact layout, shifted |
| tastatur_005 | ABC grid (uppercase, no Shift) |
| tastatur_006 | Special-character keyboard |
| tastatur_007 | Mirror – QWERTZ mirrored horizontally |
| tastatur_008 | QWERTZ with CapsLock in the middle of the home row |
| tastatur_009 | Cursor – left cluster + cursor bridge + right island |
| ID | Concept |
|---|---|
| tastatur_101 | Islands – vowels on top / bridge / consonants below |
| tastatur_102 | Spiral – a–z clockwise on a 6×5 grid |
| tastatur_103 | Hub – E in the geometric centre, frequent letters as neighbours |
| tastatur_104 | Chessboard – vowels/consonants in an alternating pattern, incl. umlauts |
| tastatur_105 | Wraparound – frequent letter pairs at opposite edges |
Plan paths ahead The timer only starts on the first movement. Look at the target word and plan the path before you begin.
Use direct paths The shortest path between two keys often runs diagonally — when diagonal navigation is active, you can exploit this on every keyboard.
Use wraparound Wraparound is always active: the cursor jumps from the edge straight to the opposite side. On keyboards with frequent letter pairs at opposite edges (e.g. tastatur_105 “Wraparound”) this saves many moves.
Cursor strategy The left/right keys on the keyboard move the text input cursor. On certain layouts it pays off to type the letters that are close together first and then insert the distant letter with left — instead of navigating back and forth.
CapsLock instead of Shift For words with several consecutive uppercase letters (abbreviations: NASA, HTML, USB) CapsLock pays off instead of pressing Shift repeatedly — especially on tastatur_008, where CapsLock sits centrally in the home row.
Mind the cursor position after typing After every key press the cursor stays on the last pressed key. Choose letters in an order that leaves short paths to the next target.
Use hub letters On the hub keyboard (tastatur_103) E sits in the centre. Words with many E's have extremely short paths — E is always at most 1–2 steps away.
Track the optimum value The footer shows Opt: N — the theoretically minimal number of moves. The completion overlay shows your deviation from it (+N) as a clear indicator of room for improvement.
For groups who want to compete together — a team day, for instance. Everyone plays the same phrases against the same clock, each on their own device, and a shared ranking appears at the end.
Whoever started may play as well — they simply join like everybody else.
Each phrase is worth up to 100 points. Full marks go to the shortest possible route; every detour costs accordingly. A phrase you are halfway through when time runs out counts pro rata.
What counts is not who types fastest, but who takes the fewest detours. That is deliberate: on an older phone the control pad responds more slowly, so if time were the measure, the newest handset would win rather than the sharpest mind. Three clean phrases can therefore beat four scrappy ones.
The keyboard, the rule set and diagonal navigation are set by whoever starts the contest. While it runs, key hints and the SIM button are switched off for everyone, even if you normally have them on. Whether your control pad sits on the left, the right or in the middle is still up to you.
Phrases are chosen on the short side, are drawn from every level of the keyboard and differ from those of the previous contests — so nobody can drill a fixed set.
A group contest is one evening. A team stays — and with several teams you can play a whole season with a table, like a club league.
Most of it runs in the browser, not in the app: a table, a fixture list and squad management are easier to handle on a computer, and that way people who have not installed the app can follow along too. It also keeps the app lean.
https://flinqefinga.de/DenkeUndSeiSchnell/liga/?lang=en
You need an online player account (player settings). Then:
That is all. From now on your results count for that team.
Nobody can add you. Not even the captain — you become a member only by joining yourself. That is deliberate: otherwise anyone could write other people's names into a team.
In the browser at …/liga/kapitaen.php, no sign-in needed. You choose a name, a three-character tag, a colour and a motto, and you receive two codes:
Write both down; the captain code is shown only once. If it falls into the wrong hands, just draw a new one — the old one stops working at once. When the captaincy changes, you hand the code over; your player account is not affected.
Every ordinary group contest has a team result alongside the individual ranking. After the contest, the Mannschaftswertung im Browser button on the result screen takes you there.
The three best results of each team are counted. So any number of people may take part without large teams gaining an advantage — and it is still worth having many entrants, because the chance of three good results grows.
If you belong to several teams, the app asks after joining which one you are playing for in this contest. If you belong to only one, that happens by itself.
Over several weeks: one matchday per week, on which two teams face each other.
You play as always — a matchday is an ordinary group contest, you just enter the code. The scoring, however, works like a team match in chess: board 1 against board 1, board 2 against board 2 and so on. Whoever wins their board takes a board point; a tie gives half a point to each. The board points decide the match: a win is three table points, a draw one.
Compared first is the score, then who needed fewer moves, then the time. If somebody does not turn up, they lose their board — the rest of the team still counts normally.
Which board you play is set by your captain before the matchday. The rule: board 1 is the strongest. The order must follow playing strength, otherwise the server rejects it — else one could hide the best player at the back and win cheaply there.
Table, fixtures and the board duels of every matchday are in the browser at …/liga/saison.php.
Alongside the season there can be a cup: a knockout tournament with one round per matchday. Lose and you are out; win and you go through — until only two are left for the final.
Nothing changes for you. A cup round is an ordinary group contest again: enter the code and play. Line-ups work just as on a matchday.
If a tie is level on board points, the decision goes, in order, to the result on board 1, then to the team's lower total number of moves, and if that is equal as well, the home team goes through. Nothing is ever decided by drawing lots — otherwise the same tie could come out differently when it is scored again.
With an odd number of teams, one goes through without an opponent (a bye). The bracket is in the browser, on the same page as the table.
With enough teams there are several leagues stacked on top of each other. At the end of the season the bottom teams of the upper league go down and the top teams of the lower one come up.
You need do nothing and keep nothing in mind: the promotion and relegation places are colour-marked in the table, all season long. That is the whole point — the bottom of the table still has something at stake, and a matchday down there matters as much as one at the top.
flinqe finga was developed with Flutter · © 2026