
Page generated from: QSet_Spec_v4.4.md
Version 4.4 - The Baseline Standard
Updated: January 2025
Q-Set (Quick SET) is the baseline specification for SET Files. It defines the minimal, guaranteed feature set that all SET file parsers should support.
Philosophy: Q-Set is the solid foundation. Simple, stable, and reliable. If you can read .qset files, you have everything you need for configuration, data tables, and text content.
File Extension: .qset
Relationship to X-Set: Q-Set is complete on its own. X-Set (eXtended SET) provides optional extensions when you need additional capabilities. See XSet_Overview_v4.4.md for details.
✅ Core Features:
[GROUPNAME] for organizing data[{GROUPNAME}] for multi-line content with no escaping|)!)delimiters extension)[THIS-FILE] group)[THIS-FILE] group with an X-SET declaration. See XSet_Overview_v4.4.md.
Q-Set uses fixed delimiters. These cannot be changed in Q-Set (use X-Set if you need custom delimiters).
[][{}]| (pipe)! (exclamation, for nested arrays)\ (backslash)A Q-Set file consists of:
myconfig.qset
Configuration file for MyApp
Created: 2025-01-22
[DATABASE]
Host|localhost
Port|5432
[APP_SETTINGS]
Theme|dark
Language|en-US
Format: [GROUPNAME]
Naming Rules:
-)_)
[CONFIG]
AppName|MyApplication
Version|1.0.0
Debug|false
[USERS]
{id|username|email}
1|alice|alice@example.com
2|bob|bob@example.com
Groups can contain:
1. Key-Value Pairs:
[SETTINGS]
Width|1920
Height|1080
Fullscreen|true
2. Tables with Field Definitions:
[EMPLOYEES]
{id|name|department|email}
101|Alice|Engineering|alice@example.com
102|Bob|Sales|bob@example.com
103|Carol|Marketing|carol@example.com
3. Simple Lists:
[ALLOWED_HOSTS]
localhost
127.0.0.1
example.com
api.example.com
4. Delimited Arrays:
[SERIAL_CONFIG]
Protocol|RS232|9600|8|N|1|none
A group ends when:
[GROUPNAME])
[DATABASE]
Host|localhost
Port|5432
[APP]
Name|MyApp
Version|1.0
The empty line between [DATABASE] and [APP] ends the DATABASE group.
Text groups store multi-line content with no escaping or delimiter processing. This is perfect for licenses, README content, code samples, JSON/XML/HTML blocks, etc.
Format: [{GROUPNAME}]
Rules:
| are literal
[{LICENSE}]
MIT License
Copyright (c) 2025 Your Name
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software...
[NEXT_GROUP]
Text groups are excellent for embedding code samples or structured data:
[{JSON_CONFIG}]
{
"database": {
"host": "localhost",
"port": 5432
},
"cache": {
"enabled": true,
"ttl": 3600
}
}
[{PYTHON_SAMPLE}]
def hello(name):
print(f"Hello, {name}!")
return True
[{HTML_TEMPLATE}]
<div class="container">
<h1>{{title}}</h1>
<p>{{content}}</p>
</div>
Text groups can be referenced in regular groups:
[APP_INFO]
Name|MyApp
License|[{LICENSE}]
Template|[{HTML_TEMPLATE}]
[{LICENSE}]
MIT License
Copyright (c) 2025...
[{HTML_TEMPLATE}]
<html>...</html>
When parsing, [{LICENSE}] as a value indicates the parser should retrieve the content of the LICENSE text group.
config.qset
Application configuration for production
[DATABASE]
Host|db.example.com
Port|5432
Username|app_user
Database|myapp_production
[CACHE]
Host|redis.example.com
Port|6379
TTL|3600
[APP]
Name|MyApplication
Version|2.1.0
Debug|false
LogLevel|INFO
users.qset
User database for MyApp
[USERS]
{id|username|email|role|active}
1|alice|alice@example.com|admin|true
2|bob|bob@example.com|user|true
3|charlie|charlie@example.com|user|false
4|diana|diana@example.com|moderator|true
app.qset
Application data and documentation
[CONFIG]
AppName|MyApp
Version|1.0.0
Author|CodeMonkey
License|[{LICENSE}]
[BUILD]
Command|npm run build
Output|dist/
Entry|src/index.js
[{LICENSE}]
MIT License
Copyright (c) 2025 CodeMonkey
Permission is hereby granted, free of charge...
[{README}]
# MyApp
This is a simple application that demonstrates Q-Set configuration.
## Features
- Fast loading
- Simple config
- Easy to edit
## Installation
npm install
Using the secondary delimiter ! for nested data:
menu.qset
Application menu structure
[MENU_ITEMS]
{id|label|subitems}
1|File|New!Open!Save!Save As!Exit
2|Edit|Undo!Redo!Cut!Copy!Paste!Preferences
3|View|Zoom In!Zoom Out!Full Screen!Toggle Sidebar
4|Help|Documentation!About!Check for Updates
Parse each field, then split the subitems field on ! to get the nested array.
When you need literal pipe or backslash characters in data:
expressions.qset
[EXPRESSIONS]
Condition|value > 10 \| value < 5
WindowsPath|C:\\Program Files\\MyApp\\data
Regex|\\d+\\.\\d+
[SETTINGS]
Expression|price \| quantity > 100
The \| becomes a literal pipe, \\ becomes a literal backslash.
Groups:
[DATABASE], [APP_SETTINGS][UserProfiles], [OrderItems][EMAIL_CONFIG] not [EC][{LICENSE}], [{README}], [{TEMPLATE}][{JSON_CONFIG}], [{SQL_SCHEMA}].qset extensiondatabase-config.qset, users-table.qsetapp-production.qset, test-data.qset
myapp-config.qset
Production configuration for MyApp
Last updated: 2025-01-22
Database connection settings
[DATABASE]
Host|db.example.com
Port|5432
Redis cache configuration
[CACHE]
Host|redis.example.com
Port|6379
Application settings
[APP]
Name|MyApp
Version|1.0.0
Use text groups for:
\| and \\ work as expectedText outside of groups is ignored and serves as comments:
myfile.qset
This is a comment explaining the file.
It will be ignored by the parser.
[CONFIG]
Key|Value
Another comment here describing the next group.
[DATABASE]
Host|localhost
Documentation pattern:
Text immediately before a group (with no blank line) is considered documentation for that group:
Database connection settings for production environment
[DATABASE]
Host|db.example.com
Port|5432
For tables, define field names on the first line after the group marker:
Syntax: {field1|field2|field3}
[CONTACTS]
{id|name|email|phone}
1|Alice|alice@example.com|555-1234
2|Bob|bob@example.com|555-5678
3|Carol|carol@example.com|555-9012
Field definitions provide:
The parser must assume column positions or use row 1 as headers.
With field definitions:
The parser knows exactly what each field represents.
Only needed in regular groups (not in text groups).
Default escape character: \ (backslash)
Common uses:
[SETTINGS]
Expression|value > 10 \| value < 5
WindowsPath|C:\\Program Files\\MyApp\\
Regex|\\d+\\.\\d+
In text groups: No escaping needed at all
[{CODE_SAMPLE}]
if (value | flag) {
path = C:\Program Files\MyApp\
regex = \d+\.\d+
}
Everything in the text group is literal - no escape processing.
Q-Set provides everything needed for most configuration and data storage needs. However, when you need additional capabilities, X-Set (eXtended SET) offers optional extensions.
Move to X-Set when you need:
: or ; instead of |)[THIS-FILE] group).qset to .xset[THIS-FILE] group as the first groupX-SET lineXSet_Overview_v4.4.md for complete details
config.qset
[DATABASE]
Host|localhost
Port|5432
After (X-Set with custom delimiter):
config.xset
[THIS-FILE]
X-SET|delimiters:1.0
[DELIMITERS]
Primary|;
[DATABASE]
Host;localhost
Port;5432
filename.qset
Comments outside groups
[GROUP]
data
[{TEXT_GROUP}]
multi-line content
[REGULAR_GROUP] # Standard group with delimited data
[{TEXT_GROUP}] # Multi-line, no escaping
SingleValue # No delimiter
Key|Value # Key-value pair
F1|F2|F3 # Array of fields
Menu|Sub1!Sub2!Sub3 # Nested array (! delimiter)
{field1|field2} # Field definitions for tables
\| # Escaped pipe (literal |)
\\ # Escaped backslash (literal \)
[{GROUP_REF}] # Reference to text group
Any text outside groups is a comment
Documentation immediately before group
[GROUP]
This specification is licensed under the Creative Commons Attribution 4.0 International License (CC BY 4.0).
Copyright (c) 2025 Kirk Siqveland
You are free to:
Questions or feedback?
Visit: https://setfiles.org
GitHub: https://github.com/kirksiqveland/setfile
License:
Creative Commons Attribution 4.0 International (CC BY 4.0)
Copyright (c) 2025 Kirk Siqveland