Administrator

Administrator Guide

This guide covers Maskink's masking engine, rules, lists, the configuration of the AI chat and the administration settings. Here you can find what each section of the Settings screen does, how to find out why a value was or was not masked, and how to add rules specific to your organization.

User guide →

01Login and access

  • Settings are reached through the gear icon at the top right.
  • First use: If there is no administrator password yet, the Settings screen asks you to set one (at least 8 characters). There is no separate installation step; the database and the default rules are created automatically on the first request.
  • Lockout: After 5 failed logins in a row, that IP address is locked for 5 minutes.
  • Session: The session ends after a period of inactivity (set in the Security section). You can also end it with Sign out at the top right.
  • Masking screen: By default anyone on the network can mask; settings are always password-protected. You can require login for masking as well.
Note If you forget the password, delete the admin_hash row from the mk_settings table in the database; the next visit to Settings opens the set-password screen.

02How does the engine work?

For every masking request the engine applies these steps in order:

  1. Mode detection. If the user chose Automatic, the content is classified as log or script from its line structure. Some rules only run in one mode.
  2. Candidate collection. All enabled rules that match the mode run on the text; every match (or capture group of the rule) becomes a candidate.
  3. Filtering and validation. Each candidate goes through the keep lists, the variable-reference check, length limits, the exclude regex and the validators (Luhn, TCKN, IBAN, entropy…). Rejected candidates are recorded with a rejection reason.
  4. Reclassification. In rules that allow it, the category is corrected based on the value itself: a value that looks like an IP becomes IP, CORP\john is split into DOMAIN + USER, PC01$ becomes HOST and a dotted name becomes FQDN.
  5. Overlap resolution. Among overlapping candidates the one with the higher priority wins; if equal, the longer one; if still equal, the one that starts first.
  6. Propagation. Found values (if propagation is on for their category and they meet the minimum length) are also masked where they appear elsewhere in the text without context. The first label of an FQDN (db01.corp.local → db01) propagates as HOST. Parts inside a path (after / or \) are not masked by propagation.
  7. Token generation. Each unique value is turned into a token with its category's placeholder template. Numbers that would clash with a token already present in the text are skipped.
  8. Chat mapping (Chat screen only). The browser sends the chat's mapping table so far with the request. Values masked in earlier messages are found even without context in this message and get the same token; new values get the next unused number. The first labels of earlier FQDNs are also searched for as HOST. These matches appear in the mapping table with the rule Chat mapping (earlier message).
  9. Warnings. If a risk keyword appears on a line where nothing was masked, the user is warned.
Tip The fastest way to see why a value was not masked is to open the relevant rule and paste the line into the Live test area. The "Rejected candidates" table shows at which step and why each candidate was dropped.

03Overview

The opening screen of Settings:

  • Usage cards: Total runs, characters processed, values masked and average time (if statistics are enabled).
  • Last 14 days: A chart of daily runs.
  • Rules: Total, enabled, custom and broken rule counts; Maskink, PHP and PCRE versions and the JIT status.
  • Rules per category: How many rules are enabled in each category. Clicking a category filters the Rules screen by it.

If a regex fails to compile, it is listed here in a red box and a counter appears next to Rules in the side menu.

04Rules

Each rule defines how one kind of data is recognized. On the list screen:

  • Search and filters: Search in name, description, pattern or keys; filter by category, type and state (Enabled, Disabled, Custom, Built-in, Broken).
  • Enabled switch: Turns the rule on or off immediately.
  • Bulk actions: Select with the checkboxes and choose Enable / Disable selected.
  • Edit: Opens the rule editor.
  • Duplicate: Creates a disabled copy of the rule. Ideal for experimenting without changing a built-in rule.
  • Delete: Only custom rules can be deleted. Built-in rules cannot be deleted; they can be disabled or reset to default.

Names and descriptions of built-in rules are shown in the interface language; the edit form shows the stored (English) values.

Rule types

TypeWhen to use itExample
RegexValues with a known shape: IPs, token patterns, device configuration lines, the organization's host naming scheme.\bACME-[A-Z0-9]{3,}\b
Key = valueFields whose value follows a key name: password, user and server fields. You only write the key names; all spellings are matched automatically.db password
DictionaryFixed terms that cannot be recognized by a pattern: organization server names, project code names, customer names.Project Falcon | CUSTOM

05Rule editor

The editor has two parts: the rule fields on the left and the Live test on the right. Every change is tried on the sample text at the right immediately, before saving.

Common fields

  • Name / Description: Shown in the list and in the "Detected by rule" column of the mapping table.
  • Main category: Which token the match is masked with.
  • Priority (0-1000): The higher one wins on overlaps. Guide values: passwords/keys ~90, contextual rules ~70-80, generic patterns (IP, FQDN, first.last) ~40-60.
  • Runs in mode: All, Log only or Script only.
  • Enabled: Whether the rule runs.

Regex rules

  • Pattern: PCRE syntax, written without delimiters (/…/). Unicode (u) is always on.
  • Templates: {{TLD}} expands to the TLD list, {{FIRSTNAME}} to the first-name dictionary (lowercase) and {{FIRSTNAME_CAP}} to capitalized names. When you update a list, all rules using that template are updated too.
  • Flags: i case-insensitive, m multiline, s dot also matches line breaks, x extended (whitespace and comments allowed), U ungreedy.
  • Capture group → category: If empty, the whole match is masked with the main category. If you define groups, only those groups are masked and each group can get its own category. For example, for https://user:password@server: group 1 → USER, group 2 → PASSWORD.
Tip To match the context but mask only the value, keep the context outside the group: with the pattern enable secret \d (\S+) and group 1 → PASSWORD, enable secret 5 stays visible and only the hash is masked.

Key = value rules

  • Keys: One key per line. Space, _, - and . match loosely; writing user name catches username, user_name, User-Name, UserName and "user name". Case-insensitive.
  • Supported forms: key=value, key: value, "key": "value" (JSON), $Key = 'value' (PowerShell), key => value (PHP), ['key'] = value.
  • Prefix / suffix: None catches only the exact key; Prefix also catches prefixed keys such as db_user and smtp.user; Prefix + suffix also catches keys with additions on both sides such as db_password_enc.
  • Separator: Standard (= : => := ==), only =, or standard + space (for CLI forms such as password S3cret).
  • Value regex: If empty, a quoted value or an unquoted value up to the next separator is taken. Fill it in to enforce a specific format.
  • Also scan XML tags: Also catches the <password>…</password> form.

Dictionary rules

Write one term per line. A term can get its own category with the term | CATEGORY form; lines starting with # are comments. Terms are matched as whole words; if Case-sensitive is off, differences in case are ignored.

Filtering and validation

Minimum / maximum lengthValues outside this range are dropped.
ValidatorLuhn (cards), TCKN checksum, IBAN mod-97, Phone digit count, Shannon entropy (random-looking secrets), first.last (drops file extensions and code expressions), First Last (drops common words).
Min. entropyUsed only by the entropy validator. Raising it reduces false positives but increases the risk of missing real keys. Default 4.
Exclude regexApplied to the value; matching values are not masked. E.g. ^/ to skip path values.
Skip variable referencesSkips values that are not real, such as $var, ${VAR}, %VAR%, {{x}}, <placeholder> and ****. Recommended to keep on for scripts.
Skip numbers onlyDoes not mask numeric values such as uid=1000.
Reclassify by valueCorrects the category based on the shape of the value (IP, FQDN, HOST, SID).
Split DOMAIN\user valuesCORP\john → <DOMAIN_1>\<USER_1>
Take part in propagationIf turned off, a value found by this rule is masked only where it was found.

Live test

Type or paste sample text into the area on the right; try log/script behavior with the mode selector. The test results:

  • Highlighted sample: Found values in their category color; hover to see the rule and category.
  • Masked: The result with all enabled rules plus the unsaved version of the rule you are editing.
  • Rejected candidates: Every dropped value and the reason. Common reasons: Variable / placeholder reference, Numbers only, Short numeric value, Code reference (object.property), Script variable, Subnet mask / wildcard, Luhn / TCKN / IBAN check failed, Looks like a domain name.
  • Compiled regex: The actual pattern produced by key=value and dictionary rules. Useful when debugging.

The test text is remembered per rule in your browser; it is not saved on the server. If you try to save a broken regex, the editor shows the error and does not save. For built-in rules, Reset to default reverts your changes.

06Example: a rule for organization server names

If your servers are named like ACME-WEB01 and ACME-DB02:

  1. Rules → + New rule.
  2. Name: Organization server names, Main category: Hostname (HOST), Type: Regex, Priority: 75, Mode: All.
  3. Pattern: \bACME-[A-Z]{2,5}\d{2,3}\b, flag: i.
  4. Type ACME-WEB01 restarted; acme-web01 reachable into the live test area and check that both spellings get the same <HOST_1> token.
  5. Save.
Tip For a few fixed names without a pattern, use the Custom dictionary instead of writing a regex; it is faster and less error-prone.

07Custom dictionary

For terms specific to your organization that cannot be recognized by a pattern: server names, project code names, customer and partner names, internal system names. Line format:

# Servers
ACME-DC01 | HOST
SECRET-SRV | HOST
# Projects and customers
Project Falcon
AcmeBank | CUSTOM
special.person | USER

If no category is given, the rule's main category (Custom term) is used. Advanced editor opens the dictionary rule in the full editor, giving access to the live test and the case setting. You can create several dictionary rules for separate topics (Rules → New rule → Type: Dictionary).

08Categories and tokens

These fields are set for each category:

  • Label: The name shown in the interface. Labels of built-in categories are stored in English and translated on display.
  • Token prefix: Replaces {CAT} in the template (e.g. PASS for PASSWORD).
  • Color: The highlight color in the output.
  • Placeholder template: If empty, the general template is used.
  • Propagation: Are values of this category searched for everywhere in the text?
  • Case-sensitive: If on, John and john get separate tokens. On for categories where case matters, such as passwords and keys.
  • Enabled / Order: Disabled categories are never masked and do not appear on the user screen; the order sets the layout of chips and lists.

Template variables

{CAT}Token prefix (HOST)
{cat}Lowercase prefix (host)
{n}Sequence number within the run (1, 2, 3…)
{hash}A stable 8-digit digest of the value. The same value gets the same token in every run; since the digest is produced with an installation-specific secret key, it cannot be reversed.
{len}Length of the original value
{stars}Asterisks as long as the value
Caution Without {n} or {hash} in the template, different values get the same token; then the mapping table and Restore do not work. Use templates such as [MASKED_{CAT}] only when restoring is not needed.

09Lists and exceptions

These control how the engine recognizes and excludes values. Changes apply to all rules as soon as they are saved. reset to default next to each list restores it. Items are separated by lines or commas; lines starting with # are comments.

ListEffect
Values that are never maskedApplies to all categories; values such as root, localhost, n/a and true stay visible.
IPv4 ranges that are not maskedA single IP or a CIDR, e.g. 127.0.0.0/8. Add 10.0.0.0/8 if you want to leave the internal network visible for analysis, but keep in mind that this reveals your network structure.
Domains that are not maskedThese domains and all their subdomains (FQDNs and e-mail domains) stay visible: microsoft.com, gmail.com…
TLD listThe FQDN rule only treats names ending in these extensions as domain names. Be sure to add the extension of your internal domain (corp, local, lan, intra…). Do not add file extensions (py, sh, json).
First-name dictionaryList of first names for the john.smith and John Smith patterns. ASCII equivalents of names with Turkish characters (şükrü → sukru) are generated automatically.
Parts excluded from first.lastPrevents expressions such as sshd.service, app.log and config.json from being taken for users.
Code tokensPrevents code expressions such as os.path, self.name and logger.info from being taken for first.last or an FQDN.
FQDN first-label exceptionsNames starting with these labels (System.Net, ASP.NET) are not treated as FQDNs.
First Last stop wordsFilters out phrases that start with a name but are not people, such as "Can Not" or "Deniz Error".

10General settings

  • General placeholder template: The default token format for all categories (default <{CAT}_{n}>). Click the ready-made options to preview them.
  • Propagation: The global switch. The per-category setting applies in addition.
  • Minimum length for propagation: Prevents short values such as it and db from being masked everywhere in the text.
  • Default mode: The mode selected when the user screen first opens.
  • Keep subnet masks: Values such as 255.255.255.0 and 0.0.0.255 are not treated as IPs; they stay visible for network analysis.
  • Remaining-risk keywords: If this regex matches on a line where nothing was masked, the user is warned. If left empty, no warning is given.
  • Maximum input (KB): Size of text that can be masked at once. Very large values may hit PHP memory and time limits.
  • Keep usage statistics: Records only numeric statistics (characters, match count, duration); content is never stored. Each chat message also counts as a masking run.

Chat-related settings are in the Chat (AI) box at the bottom of the same screen; see the next section.

11Chat (AI)

The Chat screen places Maskink between the user and the AI service. The browser never talks to the AI service directly; all requests go through api.php on the server.

  1. The browser sends the new message as is, the earlier messages masked and the chat's mapping table to the server (session + CSRF protected).
  2. The server runs the new message through the engine (with the chat mapping). The request to the model is: system prompt + masked history + masked new message. Real values never reach the AI service.
  3. The model's reply arrives as a stream (SSE) and is passed to the browser masked.
  4. Restoring happens in the browser with the chat's mapping table. Besides the exact token form, small distortions models often make (dropped angle brackets, HTML escaping such as &lt;IP_1&gt;) are recognized. Tokens not in the mapping are shown to the user as a warning.

Settings → General settings → Chat

  • Default model: The model selected in new chats. The list is read live from the connections; users can pick another model on the chat screen.
  • Temperature: Between 0 and 2; if left empty the model's own default is used. Low values (0–0.3) are more consistent for technical support and command generation.
  • System prompt: Added at the start of every request. {EXAMPLE} is filled with sample tokens built from the current token template (e.g. <IP_1>, <HOST_1>) and {CATEGORIES} with the list of enabled categories. The default prompt is in English and tells the model to reply in the user's language. Reset to default restores it.
Caution Do not remove the “write placeholders exactly as they are, do not invent new placeholders, do not guess real values” instructions from the system prompt. Without them the model may change tokens and the reply cannot be restored.

Screenshots

Users can add screenshots to the chat. Sensitive parts of the image are covered in the browser; the server does not read, change or store the image.

  1. The text in the image is read with OCR in the browser (Tesseract.js, Turkish + English; the files are in assets/vendor/tesseract/, no internet needed). The image is not sent anywhere for reading. It is preprocessed first (2–3x upscaling if small, grayscale, contrast stretching, inversion if mostly dark) and read in two passes: page layout (PSM 3) and sparse text (PSM 11). The second pass only adds words the first missed or read poorly.
  2. Table columns: Cells in columns with headers such as User, Username, Account, Owner, Server, Host, Computer, Display Name (and their Turkish equivalents) are masked in the matching category even without rule context. A line crossing the column boundary (a plain sentence) or a large vertical gap marks the end of the table.
  3. The text that was read is masked through the mask endpoint using the chat's mapping; the word boxes of every masked value are fully covered and its token is written on top.
  4. Manual correction: The user can select a word and give it a category (hints: the value is masked in that category everywhere) or right-click a covered area to unmask it (allow: the value stays visible everywhere). Both are engine options and are also sent to the server; they apply equally to the message text and the text read from the image. Words that could not be read reliably, or that look like identifiers but were not masked, get an orange frame.
  5. Right before sending, the text read from the image is masked again with the current mapping, including the new values of the message, and the image is rendered in its final form (longest side 2000 px, JPEG). This way a value masked in the message is also covered in the image.
  6. The original image is also stored in the user's browser (only there; it is compared using the What the AI sees switch in the chat). The image that reaches the server is always the covered one.
  7. The server masks the text read from the image once more with the same mapping, hints and allow, and sends the model message + masked image text + covered image. If the model does not support images, only the text is sent. At most 6 images from the history are sent to the model again.

Which models accept images is set on the AI connections screen (Ollama reports this itself).

Caution OCR is not perfect: text that cannot be read is not covered, and sensitive content that is not text (faces, signatures, QR codes, logos) is not detected at all. Users must check the image in the window before sending. To block image sending entirely, empty the Vision-capable models field of the connections and exclude Ollama vision models; then only masked text is sent.

Where the models come from is managed on the AI connections screen, described in the next section.

Storage and privacy

  • Chats and mapping tables live only in the user's browser (localStorage); there is no copy on the server or in the database. Administrators cannot see users' chats.
  • Messages are held in memory on the server only for the duration of the request. Only numeric usage statistics (if enabled) are written to the database.
  • The AI service sees only masked text. Whether it logs requests on its side is outside the control of this application.
  • If Require login for the masking screen too is on, the chat can also be used only with an administrator session.

12AI connections

The Settings → AI connections screen lists the endpoints used by the chat. Each connection consists of an address, an optional API key and a model list. Models of enabled connections appear in the chat's model list, grouped under the connection name.

  • + New connection: Opens an empty form.
  • Edit: Opens the connection's form; changes are applied with Save.
  • Test connection: Fetches the model list with the (not yet saved) details in the form and shows the models found. With a manual model list, a very short test request is sent to the first model.
  • ↑ / ↓: Changes the order of the connection; saved immediately. Groups in the chat's model list follow this order.
  • Delete: Removes the connection. Chats using its models will have to choose another model on the next message; if the default model is on this connection, choose a new one under General settings.

Form fields

FieldDescription
NameThe group title in the model list. The connection id (e.g. vllm) is derived from the name on first save and does not change; model ids have the form <id>:<model> (e.g. vllm:gpt-oss-120b).
TypeDetermines how the addresses are built (see the table below).
Base addressThe root of the endpoint. The form shows the full addresses used for the model list and the chat below it.
API keySent with the Authorization: Bearer header. After saving it is never sent to the screen again; only its last 4 characters are shown. If left empty while editing, the current key is kept; Delete the saved key removes it.
TimeoutThe longest time to wait for a reply (seconds).
Model listAutomatic: read from the endpoint's model list (cached for 10 minutes; the refresh button on the chat screen bypasses the cache). Embedding models are not shown; you can hide other models by writing a name or /regex/i under Models to exclude. Manual: for endpoints whose model list cannot be read, or when only specific models should appear; one model name per line. Models are listed in the order written.
Model orderAutomatic list only. Models to show first, top to bottom; one name or /regex/i per line (e.g. /qwen/i brings all Qwen models to the front together). Models not listed are appended in the endpoint's order, so a model newly added to the endpoint does not disappear from the list. The Copy this list to the order field link in the Test connection result writes the current list into the field; just rearrange the lines and save. On the chat screen the first model is selected if the user has no earlier choice and there is no default model.
Vision-capable modelsModels that accept screenshots; one name or /regex/i per line. These models also receive the covered image; others only receive the text read from it. Ollama reports vision support (vision) itself. If you are not sure whether a model accepts images, do not list it: sending an image to a model that does not support it gives a “not a multimodal model” error.
EnabledModels of a disabled connection are not listed and cannot be used.
Verify the TLS certificateTurn off only temporarily for internal certificate problems.

Connection types

TypeModel listChat request
vLLM gateway{address}/v1/models{address}/<model-path>/v1/chat/completions – the model path is derived from the name: Qwen3.8-27B → qwen3-8-27b
Ollama{address}/models, falling back to {address}/api/tags{address}/v1/chat/completions
OpenAI compatible{address}/models{address}/chat/completions – a single vLLM model, OpenAI, LM Studio, LiteLLM, etc.

Default connections

The connections used until you save your own are defined in src/Seeds.php → llmConnections(). Adjust them to your environment on this screen; your changes are stored in the database.

Note Connections and API keys are stored in the database (mk_settings.llm_connections) and are not included in the Backup / export file. If nothing has been changed, the defaults are used; if you delete all connections, the chat does not work.
Caution Only masked text is ever sent to the AI, whichever connection you add. Still, check your data policy before adding an external (internet) service: masked text still contains business context.

13Backup / restore

  • Export: Downloads all rules, categories and editable settings as JSON. The administrator password and the installation-specific secret key are not exported.
  • Import: Built-in rules are matched by their key (bkey) and updated; custom rules are matched by name + type + category and added if missing. Importing the same file twice does not duplicate rules. With Delete existing custom rules first, your custom rules are replaced by those in the file. Exports from the earlier Turkish-only version (maskara) are accepted too.
  • Add missing defaults: Adds built-in rules introduced in a new version; existing rules are left untouched.
  • Reset built-ins: Resets all built-in rules and categories to their original state. Your custom rules are kept; changes made to built-in rules are lost.
Tip Always export a backup before a big change (e.g. before resetting the built-ins or importing from another installation).

14Security and change log

  • Change the administrator password: Asks for the current password and a new one of at least 8 characters.
  • Require login for the masking screen too: When on, masking is possible only with an administrator session.
  • Session timeout: In minutes, at least 5.
  • Change log: Rule, category and settings changes and successful/failed login attempts are recorded with time and IP address (the last 500 entries are shown).

All administrative requests are protected by the session and a CSRF token. Masked texts are not stored on the server; the mapping table stays only in the user's browser page.

15Troubleshooting

A value is not masked

  1. Paste the line into the Live test area of a suitable rule (e.g. kv_password for a password).
  2. If the value appears under Rejected candidates, fix it according to the reason: remove it from the keep list, relax the validator or length limit, review the "Skip variable references" option.
  3. If there is no candidate at all, no rule catches the value: add a new key to a key=value rule, write a new regex rule or add the term to the custom dictionary.
  4. If an FQDN is not recognized, its extension is most likely missing from the TLD list.
  5. If the rule runs in only one mode, try changing the test mode.

Unneeded things are masked

  • If a value should stay visible everywhere, add it to Values that are never masked; for a domain use Domains that are not masked, for an IP range IPv4 ranges that are not masked.
  • If a specific rule produces false positives (find it in the "Detected by rule" column of the mapping table), add an exclude regex, lower its priority or disable it.
  • If code expressions such as logger.info are taken for first.last, add them to Code tokens; if file names are taken for users, add them to Parts excluded from first.last.

"broken" label in the rules list

The rule's regex cannot be compiled; the engine skips this rule and the others keep working. Hover over the label to see the error message. Usually a change made to a list (e.g. a special character added to the TLD list) breaks rules that use a template.

Chat: the model list cannot be loaded

  • Open the connection on the AI connections screen and press Test connection; the error message shows the problem. The chat screen also reports unreachable connections with a yellow warning.
  • Check access from the server to the endpoint: the model list address (e.g. {address}/v1/models) must open from the server itself (proxy, firewall).
  • If the error is about TLS/certificates, check PHP's curl.cainfo setting; as a last resort, turn off Verify the TLS certificate for the connection.
  • If a model says “HTTP 302/401” or “authorization required”, it needs an API key: enter the key on the relevant connection and exclude the model from the connection without a key.

Chat: the reply arrives all at once instead of streaming

A compression or buffering layer in between (e.g. Apache mod_deflate, a reverse proxy) is holding the stream. Turn off compression and buffering for text/event-stream responses; the application already sends the X-Accel-Buffering: no header.

Chat: unrestored tokens in the reply

The model has distorted or invented a token. Check that the token instructions in the system prompt are in place; if the problem keeps happening with a particular model, choose another model as the default. Keeping the token template short and distinctive, such as <{CAT}_{n}>, makes it easier for models to preserve tokens.

Chat: a screenshot is not read

  • If the window stays in the “Preparing OCR” state, check that the browser can fetch the files under assets/vendor/tesseract/ (e.g. the …/lang/tur.traineddata address should open). The files are about 13 MB; they are cached in the browser after first use.
  • If text is read incompletely, the image may be too small or blurry; zoom in and take a new screenshot. The user must cover unreadable areas by hand.
  • If a model gives a “not a multimodal model” error, remove it from the connection's Vision-capable models list.

Masking is slow or times out

Check on the Overview that PCRE JIT is on, lower Maximum input and simplify custom regexes with broad, nested repetition such as .*.

16Technical notes

  • There is no installation. When the folder is copied to the web server, the database, tables and default rules are created automatically on the first request.
  • Database connection: config.php (host, port, database name, user, password). This file is not accessible over the web.
  • Tables: mk_settings (settings), mk_categories, mk_rules, mk_audit (change log), mk_usage (numeric statistics).
  • Built-in rules are defined in src/Seeds.php; the engine is in src/Engine.php. After upgrading, run Backup → Add missing defaults.
  • The interface uses no CDN; Tailwind is loaded from the local assets/js/tailwind.js file, so no internet connection is needed.
  • Access: the src/, partials/, guides/ and lang/ folders are not accessible over the web.
  • Chat components: page chat.php, client assets/js/chat.js, screenshot reading and covering assets/js/vision.js (Tesseract.js 5.1.1, assets/vendor/tesseract/), connection client src/Llm.php (default connections in src/Seeds.php → llmConnections()); endpoints api.php?action=chat.models, chat.send and, for administration, llm.list, llm.save, llm.test, llm.reorder, llm.delete. The application root opens the Chat screen directly.
  • Language: The interface is English by default; the language button in the top bar switches to Turkish (the choice is kept in the mki_lang cookie). Translations live in lang/tr/*.php, each returning an [English => Turkish] array; PHP uses t() / te() and JavaScript uses MK.t(). Names of built-in rules and categories are stored in English and translated on display.
  • Database and session: Maskink uses its own maskink database, the MASKINKSESS session cookie and mki- prefixed browser storage, so it is independent of other installations on the same server.