Last modified by Agnease on 2026/05/26 11:00

From version 12.4
edited by Agnease
on 2026/05/26 11:00
Change comment: There is no comment for this version
To version 1.1
edited by Agnease
on 2026/05/18 18:52
Change comment: Imported from XAR

Summary

Details

Page properties
Title
... ... @@ -1,1 +1,1 @@
1 -How to Customize XWiki Without Creating Upgrade Problems
1 +XWiki custom development
Content
... ... @@ -5,17 +5,16 @@
5 5   <section class="resource-header" aria-labelledby="hero-title">
6 6   <div class="container">
7 7   <div class="text-center">
8 - <div class="hero-kicker">
8 + <div class="resource-kicker">
9 9   <i class="fa fa-code" aria-hidden="true"></i>
10 10   XWiki custom development guidance
11 11   </div>
12 12   </div>
13 13  
14 - <h1 id="hero-title">Why XWiki custom development needs structure, documentation and upgrade awareness</h1>
14 + <h1 id="hero-title">How to customize XWiki safely without creating upgrade problems</h1>
15 15  
16 16   <p class="resource-summary">
17 - XWiki can be adapted to complex business needs. The important part is to keep custom work documented,
18 - versioned and easy to validate during future upgrades.
17 + Custom code does not have to make XWiki fragile. The real risk is unmanaged customization, not customization itself.
19 19   </p>
20 20   </div>
21 21   </section>
... ... @@ -23,325 +23,207 @@
23 23   <section class="resource-page">
24 24   <div class="container">
25 25   <div class="resource-layout">
26 - <aside class="resource-sidebar" aria-label="Page summary">
27 - <h4>In this guide</h4>
28 - <ul>
29 - <li><a href="#why-customize">Why customize XWiki</a></li>
30 - <li><a href="#where-risk-appears">Where risk appears</a></li>
31 - <li><a href="#safe-model">Safe model</a></li>
32 - <li><a href="#upgrade-validation">Upgrade validation</a></li>
33 - <li><a href="#practical-checklist">Checklist</a></li>
34 - <li><a href="#strategic-advantage">Strategic advantage</a></li>
35 - <li><a href="#custom-development-faq">FAQ</a></li>
36 - </ul>
37 - </aside>
38 38  
39 39   <article class="resource-content">
40 40  
41 41   <p>
42 - Many organizations choose XWiki because it can grow beyond a simple documentation space. A platform may start
43 - with pages, attachments and permissions, then evolve into structured applications, approval workflows, custom
44 - dashboards, branded PDF exports, integrations or internal tools built around the company’s real processes.
29 + XWiki is often selected because it can adapt to real business processes. Teams can start with standard wiki
30 + features, then add structured pages, templates, dashboards, workflows, PDF exports, integrations, macros,
31 + UI extensions or Java components when the organization needs more than generic content editing.
45 45   </p>
46 46  
47 47   <p>
48 - This flexibility is valuable, but it also raises a legitimate concern: will custom development make upgrades
49 - harder? The answer depends less on the existence of custom code and more on the way it is organized. A controlled
50 - customization can remain stable for years. An undocumented change applied directly in production can become a
51 - maintenance problem after the next upgrade.
35 + This flexibility is a major advantage, but it also creates a common concern: if the platform is customized too
36 + much, will future upgrades become expensive or risky? The answer depends less on how much customization exists
37 + and more on how that customization is designed, tracked, documented and tested.
52 52   </p>
53 53  
54 54   <div class="resource-note">
55 55   <p>
56 - <strong>In practice:</strong> XWiki custom development should be separated from standard platform pages,
57 - documented, kept under source control, tested on staging and reviewed during upgrades. This makes custom
58 - features easier to maintain instead of turning them into hidden dependencies.
42 + <strong>The main point:</strong> custom development is not the problem. Uncontrolled custom development is.
43 + When delivered in a controlled way, custom XWiki features can remain stable across multiple upgrades.
59 59   </p>
60 60   </div>
61 61  
47 + <h2 id="why-customize">Why organizations customize XWiki</h2>
48 +
62 62   <p>
63 - XWiki custom development is the process of adapting the platform with custom pages, classes, objects, sheets,
64 - templates, scripts, macros, UI extensions, Java components or integrations. The goal is to support real
65 - business processes while keeping the instance understandable, maintainable and upgrade-aware.
50 + Many organizations can use XWiki successfully with standard features. But production platforms often evolve
51 + beyond generic pages and spaces. They need to reflect internal processes, compliance requirements, document
52 + governance, reporting needs or integrations with other business systems.
66 66   </p>
67 67  
68 - <div class="resource-note">
69 - <p>
70 - <strong>The main point:</strong> custom code is not the problem. Uncontrolled custom code is. XWiki can be
71 - customized safely when changes are separated from standard pages, tracked, documented and tested.
72 - </p>
73 - </div>
55 + <p>Typical XWiki customizations include:</p>
74 74  
75 - <h2 id="why-customize">Why XWiki custom development exists</h2>
57 + <ul>
58 + <li>custom document metadata, classes, sheets and templates</li>
59 + <li>structured applications for internal processes</li>
60 + <li>approval workflows and controlled document lifecycles</li>
61 + <li>custom dashboards, reports and LiveData views</li>
62 + <li>branded PDF exports and document templates</li>
63 + <li>UI extensions, panels, macros and page actions</li>
64 + <li>integrations with authentication, storage, CRM, ticketing or AI systems</li>
65 + <li>scheduled jobs, notifications and automation</li>
66 + </ul>
76 76  
77 77   <p>
78 - Avoiding all customization may look safer at first, but it can create other costs. Users may start maintaining
79 - side spreadsheets, sending approvals by email, duplicating data in external tools or bypassing the wiki because
80 - it does not match their daily work. In these cases, a well-designed XWiki customization can simplify the process
81 - and improve adoption.
69 + Avoiding all customization can create hidden costs: manual workarounds, duplicated tools, weak adoption and
70 + processes that remain outside the knowledge platform. The goal is not to customize everything. The goal is to
71 + customize the right things in a maintainable way.
82 82   </p>
83 83  
74 + <h2 id="customization-risks">Where customization becomes risky</h2>
75 +
84 84   <p>
85 - Typical examples include custom metadata for documents, templates for recurring content, dashboards for teams,
86 - approval flows, notifications, PDF layouts, page actions, UI extensions, macros and integrations with systems
87 - such as authentication providers, ticketing tools, storage services, CRM platforms or AI assistants. These
88 - features can be implemented at different levels, from wiki pages and scripts to packaged Java extensions.
77 + XWiki makes it easy to add logic in wiki pages, Velocity scripts, Groovy scripts, templates, panels, macros,
78 + UI extensions and Java components. That power needs discipline. A customization becomes risky when nobody can
79 + quickly explain where it is implemented, why it exists and how it should be validated after an upgrade.
89 89   </p>
90 90  
91 - <h2 id="where-risk-appears">Where customization becomes risky</h2>
82 + <p>Common warning signs include:</p>
92 92  
93 - <p>
94 - Problems usually appear when nobody can quickly explain where a customization is implemented, why it exists or
95 - how it should be tested. Business logic mixed into regular content pages, standard pages changed without notes,
96 - scripts that exist only in production, hardcoded group names or missing upgrade checks are common signs that the
97 - customization process needs more structure.
98 - </p>
84 + <ul>
85 + <li>business logic mixed directly into regular content pages</li>
86 + <li>standard XWiki pages modified without documentation</li>
87 + <li>important scripts existing only in production</li>
88 + <li>no source control or release history for custom code</li>
89 + <li>hardcoded users, groups, page names, URLs or workflow states</li>
90 + <li>custom features missing from upgrade validation plans</li>
91 + <li>urgent fixes applied in production and never cleaned up later</li>
92 + </ul>
99 99  
100 - <p>
101 - This is especially important in XWiki because custom logic can live in several places: classes, objects, sheets,
102 - templates, Velocity or Groovy scripts, panels, UI extensions, macros, scheduled jobs and Java components. The
103 - flexibility is useful, but each important customization should have a clear location and a clear maintenance
104 - path.
105 - </p>
94 + <h2 id="safe-model">A safer model for XWiki custom development</h2>
106 106  
96 + <h3>1. Separate custom code from standard XWiki pages</h3>
107 107   <p>
108 - Customizations should also be reviewed as part of the wider platform risk model. See
109 - <a href="$xwiki.getURL('resources.xwiki-security-review')">what an XWiki security review should actually include</a>
110 - for related checks around permissions, authentication, extensions, infrastructure and operational practices.
98 + Custom pages, classes, templates, scripts and configuration should usually live in dedicated technical spaces,
99 + such as a company-specific <code>Code</code>, <code>Applications</code>, <code>Templates</code> or
100 + <code>Config</code> area. This keeps the difference between standard distribution content and company-specific
101 + logic clear during upgrades.
111 111   </p>
112 -
113 - <div class="resource-inline-cta">
114 - <p>
115 - <strong>Unsure how maintainable your XWiki customizations are?</strong>
116 - A customization review can help identify hidden scripts, undocumented logic,
117 - upgrade risks and features that should be documented, cleaned up or packaged properly.
118 - </p>
119 - <a class="btn btn-secondary" href="$xwiki.getURL('contact.WebHome')">Request a customization review</a>
120 - </div>
121 121  
122 - <h2 id="safe-model">A safer model for XWiki custom work</h2>
123 -
124 - <h3>1. Keep custom code separate from standard XWiki pages</h3>
104 + <h3>2. Document each important customization</h3>
125 125   <p>
126 - Custom classes, scripts, templates and configuration should usually live in dedicated technical spaces, for
127 - example a company-specific <code>Code</code>, <code>Applications</code>, <code>Templates</code> or
128 - <code>Config</code> area. This makes it easier to see what belongs to the standard distribution and what belongs
129 - to the organization.
106 + Every significant customization should have a short technical note: what it does, where it is implemented, who
107 + requested it, what pages or components are involved, what assumptions it makes and how it should be tested.
130 130   </p>
131 131  
132 - <h3>2. Document the purpose, not only the implementation</h3>
110 + <h3>3. Track wiki-based customizations</h3>
133 133   <p>
134 - A short technical note is often enough: what the customization does, who uses it, where it is implemented, what
135 - assumptions it makes and what should be checked after an upgrade. This turns custom work from a hidden script
136 - into a maintainable part of the platform.
112 + Many practical features can be built directly in the wiki using XWiki classes, objects, sheets, templates,
113 + Velocity, Groovy, UI extensions or dashboards. These should still be grouped, documented and exported or
114 + versioned when they become important for the business.
137 137   </p>
138 138  
139 - <h3>3. Keep custom code under source control</h3>
117 + <h3>4. Use Java extensions for larger or long-term features</h3>
140 140   <p>
141 - Custom development should not exist only inside the production wiki. Java code, scripts, XAR packages,
142 - deployment files and templates should be stored in a source control system, such as Git. This gives the team a
143 - history of what changed, when it changed and why.
119 + When a customization becomes complex, reusable or business-critical, a Java extension is often a better
120 + long-term solution. This is especially useful for event listeners, custom services, reusable macros, scheduled
121 + jobs, integrations, workflow logic, APIs or advanced PDF export behavior.
144 144   </p>
145 145  
146 - <h3>4. Choose the right implementation level</h3>
124 + <h3>5. Use Git for serious custom development</h3>
147 147   <p>
148 - Many useful features can start as wiki-based customizations using XWiki classes, sheets, templates, Velocity or
149 - UI extensions. When a feature becomes complex, reusable or business-critical, packaging it as an extension is
150 - often a better long-term option. Event listeners, custom services, scheduled jobs, integrations and advanced
151 - workflow logic usually benefit from this approach.
126 + Important customizations should be stored in source control. Git makes it possible to understand what changed,
127 + when it changed, why it changed and whether the change can be safely rolled back or adapted for a new XWiki
128 + version.
152 152   </p>
153 153  
154 - <h3>5. Keep configuration outside the code</h3>
131 + <h3>6. Keep configuration separate from code</h3>
155 155   <p>
156 156   Group names, target spaces, template references, email recipients, external URLs and workflow settings should
157 - not be hardcoded when they are likely to change. Configuration pages or preference objects make the feature
158 - easier to adapt without rewriting the implementation.
134 + not be hardcoded when they are likely to change. Configuration pages or preference objects make the solution
135 + easier to adjust without editing the implementation.
159 159   </p>
160 160  
161 - <h2 id="upgrade-validation">Validate custom features during upgrades</h2>
162 -
138 + <h3>7. Test custom features during every upgrade</h3>
163 163   <p>
164 - A successful upgrade is not only one where XWiki starts and standard pages load. The upgrade plan should also
165 - include the features that make the instance specific to the organization: custom dashboards, templates, macros,
166 - workflows, permissions, notifications, PDF exports, scheduled jobs and integrations.
140 + A successful upgrade is not only one where the server starts. Custom dashboards, workflows, macros, PDF exports,
141 + notifications, integrations, permissions and scheduled jobs should be part of the validation checklist.
167 167   </p>
168 168  
169 - <p>
170 - For each important customization, the team should know what to test and what a successful result looks like. A
171 - staging environment or temporary clone is usually the safest place to run this validation before production is
172 - touched.
173 - </p>
144 + <h2 id="tracking-checklist">Practical tracking checklist</h2>
174 174  
175 - <p>
176 - For a broader upgrade preparation model, see
177 - <a href="$xwiki.getURL('resources.why-upgrade-xwiki')">why regular XWiki upgrades matter</a>.
178 - </p>
146 + <ul class="resource-checklist">
147 + <li>List all important custom pages, templates, sheets, macros, scripts and Java extensions.</li>
148 + <li>Identify which customizations are business-critical and which are historical or optional.</li>
149 + <li>Move technical logic into dedicated spaces instead of regular content pages where possible.</li>
150 + <li>Store Java code, scripts, XAR packages and deployment files in Git.</li>
151 + <li>Document the purpose, owner, technical location and validation steps for each customization.</li>
152 + <li>Use staging or a temporary clone to test custom features before production upgrades.</li>
153 + <li>Review hardcoded references to users, groups, spaces, page names, URLs and external systems.</li>
154 + <li>Remove obsolete customizations instead of carrying them through every upgrade cycle.</li>
155 + <li>Package larger features as extensions when they become reusable or business-critical.</li>
156 + </ul>
179 179  
180 - <div class="resource-note">
181 - <p>
182 - <strong>A practical rule:</strong> production can receive urgent fixes when necessary, but it should not become
183 - the only place where the real version of a customization exists. After the emergency, the change should be
184 - reviewed, documented and added to the normal maintenance process.
185 - </p>
186 - </div>
158 + <h2 id="delivery-process">A controlled delivery process</h2>
187 187  
188 - <div class="resource-inline-cta">
189 - <p>
190 - <strong>Not sure how risky your current XWiki version is?</strong>
191 - A short technical review can clarify the upgrade path, extension compatibility,
192 - custom code risks and validation needs before production is touched.
193 - </p>
194 - <a class="btn btn-secondary" href="$xwiki.getURL('contact.WebHome')">Request a quick review</a>
195 - </div>
196 -
197 - <h2 id="practical-checklist">XWiki custom development checklist</h2>
198 -
199 199   <p>
200 - A maintainable XWiki customization should be easy to locate, explain, test and update. The following checklist
201 - can be used as a starting point when reviewing existing custom work or planning a new feature.
161 + Custom code should be treated as part of the platform architecture, not as a temporary patch. A practical
162 + delivery process can be simple, but it should be repeatable.
202 202   </p>
203 203  
204 - <ul class="resource-checklist">
205 - <li>Separate custom pages, scripts and configuration from standard XWiki content.</li>
206 - <li>Document the business purpose, technical location and validation steps.</li>
207 - <li>Keep custom code and important assets under source control, for example in Git.</li>
208 - <li>Test custom features on staging before production upgrades.</li>
209 - <li>Review old customizations and remove what is no longer used.</li>
165 + <ol>
166 + <li><strong>Clarify the need:</strong> define the business problem and the users affected.</li>
167 + <li><strong>Choose the right implementation level:</strong> wiki pages, scripts, XAR package or Java extension.</li>
168 + <li><strong>Develop outside production:</strong> use a development or staging environment for non-trivial work.</li>
169 + <li><strong>Track the change:</strong> store code, scripts, configuration and documentation in a maintainable form.</li>
170 + <li><strong>Validate the behavior:</strong> test permissions, rendering, workflows, exports, jobs and integrations.</li>
171 + <li><strong>Deploy with notes:</strong> record what changed and what should be checked during future upgrades.</li>
172 + </ol>
173 +
174 + <h2 id="common-mistakes">Common mistakes to avoid</h2>
175 +
176 + <ul>
177 + <li><strong>Changing standard pages without a plan.</strong> Direct changes are harder to compare, explain and preserve.</li>
178 + <li><strong>Using production as the development environment.</strong> Quick fixes may be necessary, but they should be reviewed and integrated properly afterwards.</li>
179 + <li><strong>Leaving scripts undocumented.</strong> A script that nobody understands becomes a maintenance risk.</li>
180 + <li><strong>Hardcoding business assumptions.</strong> Roles, groups, spaces and external systems change over time.</li>
181 + <li><strong>Testing only standard XWiki features during upgrades.</strong> Custom behavior is often where the real upgrade risk is found.</li>
210 210   </ul>
211 211  
212 212   <h2 id="strategic-advantage">Custom code can become a strategic advantage</h2>
213 213  
214 214   <p>
215 - Many useful platform features start as custom development for one concrete need. A workflow, dashboard,
216 - integration or structured application may first solve a private business problem, then become a reusable
217 - internal component or even a public extension. This is how practical solutions often mature.
187 + Some of the most useful solutions in a platform environment start as custom code for a real project. A workflow,
188 + dashboard, macro, integration or structured application may begin as a private need, then become a reusable
189 + internal product or even a public extension.
218 218   </p>
219 219  
220 220   <p>
221 - The goal is not to customize everything. The goal is to customize the right parts, in a way that can be
222 - understood and maintained later. When custom work is separated, documented, versioned and tested, XWiki can stay
223 - flexible without becoming fragile.
193 + This is why the question should not be whether XWiki custom development should be avoided. The better question
194 + is how to make it maintainable. When customizations are separated, documented, versioned and tested, they can
195 + help the organization build a knowledge platform that matches its real work instead of forcing users into
196 + disconnected tools and manual workarounds.
224 224   </p>
225 225  
226 - <h2 id="custom-development-faq">XWiki custom development FAQ</h2>
227 -
228 - <details class="resource-faq-item" open>
229 - <summary>Does custom development make XWiki harder to upgrade?</summary>
230 - <p>
231 - Not automatically. Custom development becomes harder to upgrade when it is undocumented, mixed with regular
232 - content, applied directly in production or missing from the upgrade validation plan. Well-organized custom work
233 - can remain maintainable across upgrades.
234 - </p>
235 - </details>
236 -
237 - <details class="resource-faq-item">
238 - <summary>Where should XWiki custom code be stored?</summary>
239 - <p>
240 - Custom wiki pages, scripts, templates and configuration should usually be kept in dedicated technical spaces.
241 - Code and important assets should also be tracked in a source control system, such as Git, so changes are not
242 - stored only in the production wiki.
243 - </p>
244 - </details>
245 -
246 - <details class="resource-faq-item">
247 - <summary>When should an XWiki customization become an extension?</summary>
248 - <p>
249 - Packaging a customization as an extension is useful when the feature becomes complex, reusable, business-critical
250 - or shared across multiple instances. Java components, event listeners, scheduled jobs and integrations often
251 - benefit from an extension-based approach.
252 - </p>
253 - </details>
254 -
255 - <details class="resource-faq-item">
256 - <summary>What should be tested after an XWiki upgrade?</summary>
257 - <p>
258 - Besides standard pages, the validation should include custom dashboards, templates, macros, workflows,
259 - permissions, notifications, PDF exports, scheduled jobs, integrations and any custom applications used by the
260 - organization.
261 - </p>
262 - </details>
263 -
264 - <details class="resource-faq-item">
265 - <summary>Why should configuration be kept outside custom code?</summary>
266 - <p>
267 - Values such as group names, target spaces, external URLs, email recipients and workflow settings can change over
268 - time. Keeping them in configuration pages or preference objects makes custom features easier to adapt without
269 - changing the implementation.
270 - </p>
271 - </details>
272 -
273 - <div class="resource-note">
274 - <p>
275 - Related resources:
276 - <a href="$xwiki.getURL('resources.xwiki-security-review')">what an XWiki security review should actually include</a>
277 - and
278 - <a href="$xwiki.getURL('resources.why-upgrade-xwiki')">why regular XWiki upgrades matter</a>
279 - </p>
280 - </div>
281 -
282 282   <div class="resource-cta">
283 283   <h3>Need help reviewing XWiki customizations?</h3>
284 284   <p>
285 285   If your XWiki instance includes custom scripts, dashboards, workflows, templates, integrations or Java
286 - extensions, a customization review can help identify what is safe, what needs documentation and what should be
287 - tested before the next upgrade.
203 + extensions, a customization review can help identify what is safe, what needs documentation and what should
204 + be tested before the next upgrade.
288 288   </p>
289 289   <a class="btn btn-primary" href="$xwiki.getURL('contact.WebHome')">Request a customization review</a>
290 290   </div>
291 291  
292 292   </article>
210 +
211 + <aside class="resource-sidebar" aria-label="Page summary">
212 + <h4>In this guide</h4>
213 + <ul>
214 + <li><a href="#why-customize">Why customize XWiki</a></li>
215 + <li><a href="#customization-risks">Customization risks</a></li>
216 + <li><a href="#safe-model">Safe model</a></li>
217 + <li><a href="#tracking-checklist">Tracking checklist</a></li>
218 + <li><a href="#delivery-process">Delivery process</a></li>
219 + <li><a href="#common-mistakes">Common mistakes</a></li>
220 + <li><a href="#strategic-advantage">Strategic advantage</a></li>
221 + </ul>
222 + </aside>
223 +
293 293   </div>
294 294   </div>
295 295   </section>
296 -
297 - <script type="application/ld+json">
298 - {
299 - "@context": "https://schema.org",
300 - "@type": "FAQPage",
301 - "mainEntity": [
302 - {
303 - "@type": "Question",
304 - "name": "Does custom development make XWiki harder to upgrade?",
305 - "acceptedAnswer": {
306 - "@type": "Answer",
307 - "text": "Not automatically. Custom development becomes harder to upgrade when it is undocumented, mixed with regular content, applied directly in production or missing from the upgrade validation plan. Well-organized custom work can remain maintainable across upgrades."
308 - }
309 - },
310 - {
311 - "@type": "Question",
312 - "name": "Where should XWiki custom code be stored?",
313 - "acceptedAnswer": {
314 - "@type": "Answer",
315 - "text": "Custom wiki pages, scripts, templates and configuration should usually be kept in dedicated technical spaces. Code and important assets should also be tracked in a source control system, such as Git, so changes are not stored only in the production wiki."
316 - }
317 - },
318 - {
319 - "@type": "Question",
320 - "name": "When should an XWiki customization become an extension?",
321 - "acceptedAnswer": {
322 - "@type": "Answer",
323 - "text": "Packaging a customization as an extension is useful when the feature becomes complex, reusable, business-critical or shared across multiple instances. Java components, event listeners, scheduled jobs and integrations often benefit from an extension-based approach."
324 - }
325 - },
326 - {
327 - "@type": "Question",
328 - "name": "What should be tested after an XWiki upgrade?",
329 - "acceptedAnswer": {
330 - "@type": "Answer",
331 - "text": "Besides standard pages, the validation should include custom dashboards, templates, macros, workflows, permissions, notifications, PDF exports, scheduled jobs, integrations and any custom applications used by the organization."
332 - }
333 - },
334 - {
335 - "@type": "Question",
336 - "name": "Why should configuration be kept outside custom code?",
337 - "acceptedAnswer": {
338 - "@type": "Answer",
339 - "text": "Values such as group names, target spaces, external URLs, email recipients and workflow settings can change over time. Keeping them in configuration pages or preference objects makes custom features easier to adapt without changing the implementation."
340 - }
341 - }
342 - ]
343 - }
344 - </script>
345 -
346 346  {{/html}}
347 347  {{/velocity}}
Agnease.Code.SEODetailsClass[0]
metaDescription
... ... @@ -1,1 +1,0 @@
1 -Learn how to organize XWiki custom development, scripts, extensions and templates so your platform stays easier to maintain, document and upgrade.
metaTitle
... ... @@ -1,1 +1,0 @@
1 -How to Customize XWiki Without Creating Upgrade Problems | Agnease