-
Notifications
You must be signed in to change notification settings - Fork 0
Post Info Files
Languages: English | Français
From version 5.5 on. Everything on this page needs ngPost 5.5 or later; earlier versions have no post info files.
On this page:
- What is a post info file?
- In 3 minutes
- Where to put the model
- The three settings
- All the variables
- Your own information, and who sees it
- The password in a record sheet
- A complete example
- Exporting the sheet of an older post
- Using it from a script
- It does not work
After each post, ngPost can write a small text file next to your .nzb,
describing what you just posted: the name, the size, the archive name, your
own notes.
Some Usenet indexes ask for such a file to reference a post. ngPost knows no index format. You give it a model, and it fills in the blanks. That way, if an index changes its format, only its model changes, and everybody else is unaffected.
It is optional. As long as you do not set POST_INFO_TEMPLATE, no file is
written, nothing is asked, nothing changes.
1. Copy this into a new text file called my_sheet.txt:
date =__date__
name =__originalName__
size =__postSize__
archive =__rarName__
groups =__groups__Everything written __like_this__ is a variable that ngPost replaces. Every
other character is written exactly as you typed it, so text and variables mix
freely on one line:
comment =shot by me, __originalName__, posted in __groups__A line starting with # in the first column is a comment: it is not
written to the sheet. Indent it by one space if you want it written after all.
There is no other escaping to learn.
2. Put that file where you can read it. Next to your ngPost.conf is the
simplest choice:
| System | Folder |
|---|---|
| Windows | %LOCALAPPDATA%\ngPost\ |
| Linux | ~/.config/ngPost/ |
| macOS | ~/Library/Application Support/ngPost/ |
3. Add these two lines to your ngPost.conf:
POST_INFO_TEMPLATE = my_sheet.txt
POST_INFO_OUTPUT = __nzbDir__/__nzbName__.info.txt4. Post something.
5. Look next to your .nzb: a .info.txt file is waiting, filled in:
date =2026-08-18
name =Backup-Photos-2026.tar
size =2505484398
archive =876EFID5Y22SH1CO5C7C
groups =alt.binaries.testThat is the whole idea. The rest of this page is detail.
Anywhere. What matters is only that ngPost can read the model and write the sheet.
If the model is not in the same folder as your
ngPost.conf, write its full path. A bare file name in the configuration means "next to the configuration file", and nowhere else: ngPost will not go looking for it.
- An absolute path is used as is:
/home/me/models/my_sheet.txt,C:\Users\me\models\my_sheet.txt. - A relative path written in
ngPost.confis understood from the folder of that configuration file:my_sheet.txtmeans "next to my conf". - A relative path given on the command line (
--post_info_template) is understood from the folder you are standing in. -
~is expanded to your home folder.
AppImage users: the folder the AppImage runs from is not a place you can rely on. Put your model in your configuration folder or in your home folder. From version 5.5, a model stored in an older executable-named configuration folder is copied when ngPost adopts that folder; the original remains available to scripts using
-c.
Windows users:
C:\Program Files\...is read only for a normal user (UAC). Do not put your model, and above all not the produced file, in there.
The templates/ folder of the ngPost sources holds ready made models you can
copy, but there is nothing special about that folder: it is just examples.
From version 5.5 on, the Post information… dialog offers a list of models rather than a path to type:
- the model from your configuration (
POST_INFO_TEMPLATE) comes first, marked (default). Selecting it means "whatever the configuration says": change the configuration later and this post follows; - Choose a file… opens a file browser. A model opened this way is added to the list and stays there for the rest of your ngPost session, so the next posts of the same evening find it in one click. Closing ngPost forgets it — it is a convenience, not a setting;
- the small ✕ next to the list removes the selected model from that list. It does not delete the file, and it cannot remove the configured default;
-
Use this model for my next posts too writes the selected model into your
configuration as
POST_INFO_TEMPLATE. It then becomes the default, for this post and every one after it.
Auto Post has the same pair of controls, with one difference: what you set there applies to every post that run creates, not to a single one.
The window holds two different things, and keeping them apart is the whole point:
The model — the file, line by line. This is the file. One row per line,
in the file's order: the name on the left of the =, the content on the right
(text, variables, or both), and what will come out. Comments appear too, greyed
and marked (not written). You can change a line, add one under the selected
one, or drop one — but these changes only reach the disk through Save as…,
because the post reads the file, not this table. If you leave with unsaved
changes, ngPost says so rather than showing you one sheet and writing another.
Your fields — the values of this post. One row per __meta:name__ the
model uses, wherever it appears — alone on a line or in the middle of a
sentence. These values belong to the post, never to the model, so they are
never written into the file above. Add a field creates both the value and the
line that writes it.
The third column is a live preview: type a title and the line that uses it updates. A value already known while you prepare the post is shown as it will be; one that only exists once the post is over stays blank and says filled in after the post. And it shows the password if your model writes it — the column is what the file will hold, so hiding it there would be a comfortable lie.
The ? What can I put in a model button lists every variable ngPost knows, what each one holds, and whether it exists before or after the post. It is built from the same table the renderer uses, so it can never describe a variable ngPost does not actually support.
| Key | Example | What it does |
|---|---|---|
POST_INFO_TEMPLATE |
my_sheet.txt |
your model. Empty (the default) means the feature is off. Setting it also ticks Create a post info file on every posting tab, so you choose once and never again |
POST_INFO_OUTPUT |
__nzbDir__/__nzbName__.info.txt |
where to write the sheet. Non-secret variables work here too, and a relative path is understood from the folder of your configuration file |
POST_INFO_ONLY_ON_SUCCESS |
true (default) |
no sheet for a post that failed or is incomplete |
POST_INFO_OUTPUT accepts the same non-secret variables as the model itself,
which is handy. Secret values such as __rarPass__ are deliberately refused
in a file or directory name:
# next to the nzb (the default)
POST_INFO_OUTPUT = __nzbDir__/__nzbName__.info.txt
# all sheets together, in a folder your index watches
POST_INFO_OUTPUT = /home/me/index_inbox/__nzbName__.txt
# sorted by your own category, folders are created as needed
POST_INFO_OUTPUT = /home/me/sheets/__meta:category__/__nzbName__.txtOne post can go somewhere else. In the Post information… window, the
Write it to: field is empty by default and shows your configured
destination in grey: the post is following it, and will keep following it if
you change your configuration later. Type a path there — or pick a folder with
the … button — and this post alone writes its sheet there. The line under
the field resolves the variables, so you see the real path before posting
rather than __nzbDir__/__nzbName__.info.txt. Ticking Use this model for my
next posts too saves the destination as your new default alongside the model.
POST_INFO_ONLY_ON_SUCCESS is on by default because an index importing these
files automatically has no use for a sheet describing a broken post.
All three, and every post command setting, also exist as command line options
(--post_info_template, --post_info_output, --no_post_info_only_on_success,
…), so ngPost can be driven without any configuration file. See
Command line usage.
Anything not recognised is left untouched in the file, and ngPost tells you about it in the log, so a typo is visible rather than silent.
| Variable | Example | Meaning |
|---|---|---|
__originalName__ |
Backup-Photos-2026.tar |
the name of what you asked to post |
__sourcePath__ |
/data/backup/Backup-Photos-2026.tar |
its full path |
__originalPath__ |
/data/backup |
folder of the posted files (kept for old scripts) |
__nzbPath__ |
/data/nzb/Backup-Photos-2026.nzb |
the nzb file |
__nzbDir__ |
/data/nzb |
the folder holding it |
__nzbName__ |
Backup-Photos-2026 |
its name, without .nzb
|
__nzbFileName__ |
Backup-Photos-2026.nzb |
its name, with .nzb
|
__rarName__ |
876EFID5Y22SH1CO5C7C |
the archive name — the one to search for on Usenet |
| Variable | Example | ⚠ Read this |
|---|---|---|
__postSize__ |
2505484398 |
bytes of the prepared payload and its parity, before yEnc encoding. Without compression this is the source payload plus parity. A .nfo copied next to prepared files is not counted |
__postSizeHuman__ |
2.33 GB |
the same, readable |
__sizeInByte__ |
2505484398 |
legacy, kept unchanged for existing scripts. Prefer __postSize__ in a new model |
| Variable | Example | Meaning |
|---|---|---|
__status__ |
success |
success, partial or failed
|
__nbFiles__ |
42 |
payload files |
__nbArticles__ |
3600 |
articles |
__nbArticlesPosted__ |
3600 |
articles that went through |
__nbArticlesFailed__ |
0 |
articles that failed |
__avgSpeed__ |
12.5 MB/s |
average speed of the latest transfer attempt |
__durationSec__ |
200 |
active upload duration in seconds, accumulated across resumes |
__postId__ |
42 |
id in the history database |
__appVersion__ |
5.5 |
the ngPost that made the post |
| Variable | Example | Meaning |
|---|---|---|
__date__ |
2026-08-18 |
end of the post, local time |
__date:dd/MM/yyyy__ |
18/08/2026 |
the same, your format |
__dateStart__ |
2026-08-18 |
when the transfer started |
__dateStart:HH:mm__ |
21:30 |
the same, your format |
The format between : and __ is a Qt date format:
dd day, MM month, yyyy year, HH:mm:ss time.
| Variable | ⚠ Read this |
|---|---|
__par2Pct__ |
par2 redundancy. Empty when par2 is disabled, even if a percentage is configured, because there is no parity to describe |
__nzbPoster__ |
the poster written in the nzb. Under article obfuscation the real From: of each article is random and different: this variable is the declared one, not those |
__rarPass__ |
the archive password. See below |
__meta:<name>__ |
one of your own pieces of information, see the next section |
__postInfoPath__ |
path of the post info file itself. Empty inside the sheet (it does not exist yet), filled in for the post commands that run right after |
__jsonPath__ |
temporary json file describing the whole post, post commands only, empty in a sheet |
Your sheet does not have to look like name =value. It can be a JSON or an XML
document, which is what an index with a web API would rather receive.
Tell ngPost which one, in either of these two ways — one is enough:
-
name your model
sheet.jsonorsheet.xml, or -
write
#!json(or#!xml) on a line of its own inside the model. It is a comment, so it never shows up in the file you get.
Both are worth knowing. Naming is shorter. Declaring survives a file being
renamed or shared, and it is the only way for a model you keep as .txt. When
a model does both, the declaration wins — so a model can be called anything
and still say what it produces.
#!json
{
"archive": "__rarName__",
"title": "__meta:title__",
"size": "__postSize__"
}ngPost then takes care of the values it fills in, so a title holding a " or
an & cannot break your file. It only touches the values: your braces, your
tags and your field names stay exactly as you typed them.
Put quotes around your numbers. A value ngPost has nothing to fill in with comes out empty — an old post has no size, and there is no par2 percentage when par2 is off.
"size": ,is broken JSON,"size": ""is fine. Start fromtemplates/post_info_json.txtand this is already done.
A model that says nothing is plain text, and nothing is changed in it: your
name =value sheets keep working exactly as before.
YAML is not supported, neither by a name nor by a declaration. Quoting a
YAML value depends on where it sits in the document, and getting it half right
would quietly turn yes, null or 1.0 into a boolean, a null and a number
instead of your text — a file that opens fine but no longer says what you
wrote.
A title, a portal link, a category: ngPost cannot invent those, you type them.
In the interface: in the posting tab, click Post information…. Every
__meta:name__ your model uses appears in the Your fields table at the
bottom of the window, waiting for a value — you have nothing to guess and
nothing to declare.
Create a post info file is already ticked when POST_INFO_TEMPLATE is set in
your configuration, on every tab and for every post, so you have nothing to
tick either. Untick it to skip the sheet for one post; emptying a tab to queue
the next one clears the values you typed, but leaves the box alone.
On the command line:
ngPost -i Rando-Mercantour-2026.mkv \\
--post_meta "title=Mercantour hike, 2026" \\
--post_meta "category=My own footage"Each line has an Also in NZB box, unticked by default. A field always goes into the post info file; the box only adds a second destination:
| Post info file | Inside the nzb | |
|---|---|---|
| box unticked (default) | yes | no |
| box ticked | yes | yes |
An nzb circulates. It is shared, uploaded, sometimes republished. A portal link, a private note or a customer name has no business travelling with it. That is why nothing is published unless you say so.
On the command line the same rule applies: both write the field in the post info file, and
-m/--metapublishes it in the nzb on top of that.--post_metanever does.
A piece of information you did not fill in renders as empty. That is normal, not an error: a model is written once and used for every post.
The generic model shipped with ngPost does not write the password. Adding
password =__rarPass__ to your model is a deliberate act, because the file
then becomes as sensitive as the password itself.
When ngPost writes a sheet containing the password:
- On Linux and macOS, the file is created readable by you only, and the permissions are set before the first byte is written, so it is never exposed even briefly.
- On Windows, the file inherits the permissions of its folder. ngPost warns you in the log; put such files in a folder only you can read.
When exporting the sheet of an older post, the GUI asks before including the
password. The CLI leaves it empty unless --include_password is supplied. In
both cases it is considered only when the model actually asks for it.
Reproducing the record sheet of an index, here Baselien.
The model (baselien.txt):
date =__date:dd/MM/yyyy__
nom du post =__originalName__
taille post =__postSize__
mot de passe =__rarPass__
nom a rechercher =__rarName__
posteur =__nzbPoster__
groupe =__groups__
pourcent =__par2Pct__
portail1 =__meta:portail1__
titre =__meta:titre__
categorie =__meta:categorie__
qualite =__meta:qualite__
genre =__meta:genre__What you type in the posting tab:
| Name | Value | NZB |
|---|---|---|
portail1 |
https://example.org/my-albums/mercantour-2026 |
☐ |
titre |
Mercantour hike, 2026 |
☐ |
categorie |
My own footage |
☐ |
qualite |
1080p |
☐ |
genre |
Nature |
☐ |
What you get, next to your nzb:
date =15/08/2026
nom du post =Rando-Mercantour-2026.mkv
taille post =2505484398
mot de passe =nHkPz2wQr
nom a rechercher =876EFID5Y22SH1CO5C7C
posteur =h0wsef7@8xw81s.r7
groupe =alt.binaries.test
pourcent =8
portail1 =https://example.org/my-albums/mercantour-2026
titre =Mercantour hike, 2026
categorie =My own footage
qualite =1080p
genre =NatureThat model is in templates/post_info_baselien.txt in the ngPost sources.
Posts already in your history can produce their sheet too.
In the interface: History tab, select a post, then Export info file… (also in the right click menu).
On the command line:
# into a file
ngPost --export_post_info 42 --post_info_template my_sheet.txt -o sheet.txt
# to the standard output, to pipe it somewhere
ngPost --export_post_info 42 --post_info_template my_sheet.txtOne limit, stated plainly: for posts made before the ngPost version that introduced this feature, the par2 percentage, the source name and your own information were never recorded. Those lines come out empty, and ngPost tells you so. Other recorded values are best effort too: in particular, the password is empty when it was not stored or has since been purged. A history export does not recover it from an old NZB.
NZB_POST_CMD runs a command at the end of each post. The same variables work
there, and they are all available as environment variables, so a script can
be called with no argument at all:
NZB_POST_CMD = /home/me/scripts/send_to_index.sh#!/bin/bash
# every fixed variable of the page is here, in CAPITALS, prefixed with NGPOST_
echo "posted: $NGPOST_ORIGINAL_NAME ($NGPOST_POST_SIZE bytes)"
echo "nzb: $NGPOST_NZB_PATH"
echo "sheet: $NGPOST_POST_INFO_PATH"
# the date comes as NGPOST_DATE / NGPOST_DATE_START (ISO) and NGPOST_DATE_EPOCH
echo "date: $NGPOST_DATE"
# your own information is in a json file, keys untouched
python3 -c "import json,os; print(json.load(open(os.environ['NGPOST_JSON']))['meta'])"
curl -F "nzb=@$NGPOST_NZB_PATH" -F "sheet=@$NGPOST_POST_INFO_PATH" https://my.index/apiGood to know:
- the commands of a post run one after the other, in the order you declared them, and after the nzb upload if you configured one;
- ngPost waits for them before quitting, so a command started at the very end of a post is no longer killed halfway;
- a command that fails, crashes or cannot even start is reported in the log with its exit code and its error output;
- the exit code of ngPost is unchanged by a failed command, unless you set
POST_CMD_FAIL_IS_ERROR = true; - a command that hangs keeps ngPost alive;
Ctrl+Calways interrupts, andPOST_CMD_TIMEOUT = 300kills it after five minutes; - the archive password is not put in the environment nor in the json.
__rarPass__as an argument still works, andPOST_CMD_EXPOSE_PASSWORD = trueputs it back everywhere if you need it; - a value holding spaces or quotes stays one single argument.
| What you see | What to look at |
|---|---|
| no file at all | is POST_INFO_TEMPLATE set? Is the post a success? By default nothing is written for a failed post (POST_INFO_ONLY_ON_SUCCESS) |
cannot read the template ... |
the path in the log is the one ngPost tried. A relative path in the conf is looked up next to the conf |
cannot write ... |
the destination folder does not exist or is not yours to write in. Program Files is a classic |
refusing to overwrite ... |
the destination is your nzb, model, source/prepared file, SQLite database or CSV history. Change POST_INFO_OUTPUT
|
a __variable__ stayed as is |
typo in the name. The log lists the ones it did not recognise. Beware, it is case sensitive |
a %1 in my text became a path |
%1 is the historical alias of the nzb path in NZB_POST_CMD only. In a model it is left alone, but check you are not looking at a post command |
| a line is empty | normal for a __meta:...__ you did not fill in, and for __par2Pct__ when par2 is off |
| accents look wrong | the file is written in UTF-8. Tell your editor, or your importer, to read it as UTF-8 |
| where is the log? | the interface shows it in the bottom panel; in command line it is on the output, and LOG_IN_FILE = true writes it to a file |
Start
Use ngPost
- Configuration
- ngPost.conf reference
- Command line usage
- History and resume
- Post info files (from version 5.5)
- VPN support
Project
Démarrer
Utiliser ngPost
- Configuration
- Référence ngPost.conf
- Ligne de commande
- Historique et reprise
- Fiches de post (à partir de la version 5.5)
- Support VPN
Projet