Writing a plugin
Tiago Águeda edited this page 2026-11-12 15:26:01 +01:00

Page revisions

76 Commits

Author SHA1 Message Date
264577499f
Describe the environment variables a plugin declares
A plugin lists each variable it reads as an EnvironmentVariable in its
environment attribute and reads it with read_environment. Say how one
is named, what the start-up check and manage.py settings do with it,
how to test the declaration, and list the two names on the surface.

Refs postulo/postulo#1186

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 15:26:01 +01:00
b1ec648d47
Describe the state a sync keeps between runs
A sync plugin can read what its last good run kept with sync_state and
return the next one on SyncReport.state, at most MAX_SYNC_STATE_BYTES.
Say when it is kept and dropped, how to test it with run_sync and
kept_sync_state, and list the two names on the surface.

Refs postulo/postulo#1165

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 15:25:18 +01:00
465556abe4
Show the mark as a vector, and ask plugins to do the same
Home shows images/postulo.svg, a copy of the logo.svg the core serves
since #1238, instead of the PNG. Nothing else in the wiki, its
translations or the documentation site's build named images/postulo.png,
so it goes.

Writing a plugin says, under "A logo, if you have one": a plugin's logo,
icon or any drawn picture is kept and served as an SVG first; a raster
only where a platform takes nothing else, rendered from the SVG by a
script in the plugin's repository; Postulo's mark never copied as a
raster.

Refs postulo/postulo#1238

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 11:55:48 +01:00
273f9e5065
Describe a CV's Europass and JSON Resume downloads
In other formats names the two, says what of a CV each leaves out is named beside its
download and that the Europass file reads back through the importer; the file formats
module lists its new sub-modules, and GeoJSON, which it already had.

Refs postulo/postulo#1100

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 06:01:13 +01:00
b1355a7fe8
Name client() where the plugin surface offers it
The page sent plugins to postulo.plugins.http, which is not on the surface; client is
imported from postulo.plugins.api, as the example above it already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 05:59:28 +01:00
964249da8e
Say how a plugin's tests keep the migrated database between runs
Beside the other postulo.plugins.testing helpers: the two lines of conftest.py, what names
the copy, and how POSTULO_TEST_DB_CACHE and a cache step decide it on CI.

Refs postulo/postulo#1144

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 05:59:18 +01:00
6521760990
Describe a plugin's dashboard widget
A new section says how a plugin declares a DashboardWidget, what its context is handed, what
its template may write and how to test it; the surface's list names it, and what a widget
is handed is no longer called unsettled.

Refs postulo/postulo#1102

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 05:59:00 +01:00
3ec61c153f
Bring the scheduler's and the worker's habits up to date
Files and Configuration say how often uploads are checked and orphans looked
for, add POSTULO_SCRUB_EVERY_DAYS, and say what is now tidied by itself: the
queue's finished tasks, expired cache entries, a slow store's backlog. A
notification that failed is tried again, an idle worker is quiet, and Writing
a plugin says what that means for a notifier's send().

Refs postulo/postulo#1118
Refs postulo/postulo#1119
Refs postulo/postulo#1121
Refs postulo/postulo#1167
Refs postulo/postulo#1163
Refs postulo/postulo#1117
Refs postulo/postulo#1172

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 16:17:58 +01:00
abeb4896d8
Name the two new warnings, and what is read once and kept
Configuration and Installing Postulo name postulo.W003 and postulo.W004, give
the occupations file its new size, and say when the Overview asks the fonts
again. Writing a plugin says that the primary number and link of a contact
are read from prefetched rows.

Refs postulo/postulo#1109
Refs postulo/postulo#1110
Refs postulo/postulo#1171
Refs postulo/postulo#1133

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 16:16:47 +01:00
b39438f2e1
Say how a killed backup, a failing sync and a silent worker behave
Backups gain the .partial file an archive is written under and the ten-minute
claim of a running backup; Background work says when an interrupted errand is
marked failed and what its page says while no worker is seen. Syncs gain the
back-off of a failing connection, for the person and for a plugin author, and
what add_reminder returns.

Refs postulo/postulo#1123
Refs postulo/postulo#1131
Refs postulo/postulo#1122
Refs postulo/postulo#1162
Refs postulo/postulo#1164

Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>
2026-11-11 16:15:08 +01:00
8d2d17641f
Writing a plugin: keep the Author-email example on one line
The code span broke across lines with <address> starting the second one.
Forgejo's CommonMark reads it as code, but Python-Markdown (the documentation
site's Zensical build at wiki.tiagoagueda.com) took it for an unclosed HTML
<address> block and dropped the rest of the page after "Saying who you are".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 14:59:31 +01:00
54a83da1cd
Writing a plugin, Configuration, Tracking applications: pairing by hand (postulo/postulo#327) 2026-10-31 10:53:09 +01:00
689896f0b7
Writing a plugin, Tracking applications: print the calendar through a theme (postulo/postulo#342) 2026-10-31 09:23:59 +01:00
e95015a335
Writing a plugin: discovered fields and DiscoveredOption (postulo/postulo#332) 2026-10-31 06:16:36 +01:00
69e0adfa75
Writing a plugin, Tracking applications: export a table as a themed PDF or a CSV (postulo/postulo#341) 2026-10-31 05:46:43 +01:00
44e2422029
Writing a plugin: schedule_interview and calendar_items on the plugin surface (postulo/postulo#330) 2026-10-31 03:32:51 +01:00
dfbaf41b5c
CVs, Writing a plugin: choose the paper, A4 or US Letter either way up (postulo/postulo#344) 2026-10-29 19:40:55 +01:00
26b040e5db
Writing a plugin, The API, Tracking applications: reminder services on the plugin surface (postulo/postulo#331) 2026-10-29 19:40:37 +01:00
c585140340
Writing a plugin: SyncLink slots, collections, unbind and AlreadyPaired (postulo/postulo#326) 2026-10-29 19:40:36 +01:00
967f4f012b
Writing a plugin, Reports: a theme can draw the job-search report (postulo/postulo#340)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-29 10:52:58 +01:00
b506f9b15d
Your career record, Writing a plugin: the importer is labelled Europass import (postulo/postulo#911) 2026-10-28 21:45:53 +01:00
633bf5175d
Backup destinations: the kind, encryption with age, off-site copies (postulo/postulo#325)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 16:35:08 +01:00
13cbaed66a
Writing a plugin: a theme's own fonts, drawings and images (postulo/postulo#343)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-28 11:52:03 +01:00
55f71bf6b1
Register lookup: a company looked up in its register on a press, and the register-adapter plugin kind (postulo/postulo#1021) 2026-10-28 05:31:02 +01:00
163918a9d2
Your career record: publications filled in from a DOI or an ORCID record, on a press (postulo/postulo#688) 2026-10-28 05:30:49 +01:00
273f72cec2
Writing a plugin: companies, departments and the person's card on the surface
Refs postulo/postulo#328

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 20:17:46 +02:00
61a7f8f1af
Plugin surface: read_body and friends; settings pages gated; https webhooks; plugin templates searched last
Refs postulo/postulo#967 postulo/postulo#970 postulo/postulo#971 postulo/postulo#991

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 17:36:28 +02:00
030036f427
Groups, sharing and what stays each person's (#896)
The amended promise on Accounts and invitations, a section on groups and sharing (owner,
share, what stays yours, the trail, changing the owner, leaving, conflicts, imports), and
the plugin guide's new events and scoping calls.

Refs postulo/postulo#896

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 09:38:32 +02:00
287434db61
Places as GeoJSON
Refs postulo/postulo#880

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 22:56:52 +02:00
ea4f6133d5
A company's names in other languages, and the Wikidata fetch
Refs postulo/postulo#673

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 22:13:56 +02:00
431e2b5f1a
Describe modules, dependencies, Settings buttons, access lists and packages
Refs postulo/postulo#873
Refs postulo/postulo#874
Refs postulo/postulo#875
Refs postulo/postulo#876
Refs postulo/postulo#877
Refs postulo/postulo#883
Refs postulo/postulo#884
Refs postulo/postulo#885
Refs postulo/postulo#886

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 11:17:25 +02:00
ee6e8bd0e9
Correct the pages for the Hardening, Career ordering, Installing, Configuration, plugin, Roadmap and Troubleshooting issues
Refs postulo/postulo#537 postulo/postulo#613 postulo/postulo#540 postulo/postulo#584 postulo/postulo#404 postulo/postulo#405 postulo/postulo#406 postulo/postulo#765 postulo/postulo#745 postulo/postulo#764

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-12 08:48:16 +02:00
1f9aac1b3e
Document the Transfer registry for Import and Export buttons
Refs postulo/postulo#862

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-11 18:14:22 +02:00
5a2c90f8b2
Document plugin calendar entries and links, the new settings, backup signing and the renames
Refs postulo/postulo#887 postulo/postulo#889 postulo/postulo#780 postulo/postulo#786
Refs postulo/postulo#772 postulo/postulo#881 postulo/postulo#882

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-11 17:47:23 +02:00
6adb13aa3e
Describe the appointments with an employment service and the plugin call that adds one
Refs postulo/postulo#888

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-11 12:08:41 +02:00
149e7151a4
Say that new strings get an empty slot and are translated in Weblate, for Postulo and its plugins
Refs postulo/postulo#706
2026-10-10 12:43:57 +02:00
66b5197424 Document honours and awards, and memberships in the career record (#693)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-07 01:06:04 +02:00
74bc6efc26 A CV photo of its own: the switch on a CV, the second picture, contact.photo for themes (#668)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 21:28:11 +02:00
47c375f24a Spoken languages are chosen by code, and a CV names them in its own language (#689)
Your career record: the Languages section is a list with Other, what a CV prints, what
happened to entries already typed, the management command, archive and candidate file.
Writing a plugin: Record["languages"] gains an optional code.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 15:54:33 +02:00
64cb8de08e Events as iCalendar: download the calendar, reminders as tasks, import an .ics file, and the calendar names on the plugin surface (#661)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 08:48:33 +02:00
69f98359cc Contacts as a vCard, and the names a plugin writes one with (#660)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-06 08:48:32 +02:00
a51ee4634f Document the .odt download, the file properties choice and the document format registry (#480) 2026-10-06 07:19:32 +02:00
84ee7beabe Document messaging handles, identifier order, Markdown listings, key caps and save-as-you-go
Writing a plugin names MessagingService, MessagingServicePlugin and messaging_service_of
and says the kind registers in postulo.messaging_services. Refs postulo/postulo#682 #672
#665 #658 #656 #333

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 18:57:07 +02:00
9c85d7ab03
Say that an identifier scheme may name a brand mark
Refs postulo/postulo#654

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 16:29:09 +02:00
ccf28f174c
Document the contribution rules, the personal details, the logo dialog, the intermediary role and social-profile usernames
Refs postulo/postulo#653 #654 #671 #674 #678 #679 #680 #681

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-05 15:02:03 +02:00
a324b4a6a6
Your own email now sends from the record page; company names are compared without capitals
Configuration, Writing-a-plugin, Files-and-what-you-sent: the Email these step on Record what
you sent (sent first, frozen and recorded only if it went, an outbox plugin raises on failure).
Installing-Postulo: company and department names are unique ignoring capitals and spacing, the
upgrade stops and lists any clash, and manage.py company_name_clashes lists them beforehand.

Refs postulo/postulo#361 postulo/postulo#546

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 16:14:09 +02:00
e095367d40
Writing a plugin: who the plugin runs as, what switched off means, the installer's record, rollback and budgets
phone_number_is_taken takes asked_by and is charged to the account; a sync runs as its owner in
their language and time zone; a plugin switched off does not run at all, and the per-person page
follows the instance; install uses the catalogue whose row was pressed and a name several
catalogues list needs --catalogue; the Plugins pages draw from the last verified indexes; the
record is written atomically and fails closed; rollback keeps disabled flags; the record holds a
plugin's whole dependency closure; an upgrade needs a restart; the install budgets; the image
pin is :0.3.

Refs postulo/postulo#333 postulo/postulo#335 postulo/postulo#383 postulo/postulo#362
Refs postulo/postulo#490 postulo/postulo#601 postulo/postulo#602 postulo/postulo#382
Refs postulo/postulo#600 postulo/postulo#597 postulo/postulo#598 postulo/postulo#599
Refs postulo/postulo#604 postulo/postulo#403

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 12:04:57 +02:00
6ace621586
Importers that raise, and fetch_esco deleting the replaced revision
Refs postulo/postulo#611
Refs postulo/postulo#535

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 06:18:36 +02:00
99bb5d6196
Writing a plugin: language_override and COUNTRY_CODES join the surface
Refs postulo/postulo#636
Refs postulo/postulo#641

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-04 02:23:24 +02:00
ad68c39b2a
Constrain the image-on-top examples and name the git URL
Refs postulo/postulo#542
2026-10-03 18:58:54 +02:00