FranceHistories
Artworks

1387–1388: The Brittany Affair, Guelders, and Personal Rule

p5

Charles VI: Minority, Madness, and Civil War (1380–1422) · HIGH MIDDLE AGES

After the revolts and the restoration of authority, the late 1380s challenged the government on two fronts: holding the peripheries (Brittany) and asserting policy in the north-east (Low Countries/Empire). These episodes prepared the reassertion of royal control in 1388.


⚓ 1387: The Brittany Affair and Olivier de Clisson

Constable Olivier de Clisson was a servant of the state as much as a great Breton lord. His power and his loyalty to the king alarmed the Duke of Brittany, who saw it as interference. In 1387, Clisson was arrested at Vannes and forced to pay a costly ransom for his release. The affair revealed tensions:

  • between state service and princely interests;
  • between central government and the duchy’s autonomies;
  • between domestic peace and court rivalries.

🏞️ 1388: Expedition against the Duke of Guelders

To the east, the Duke of Guelders opposed Burgundian ambitions and sought English support. An expedition was decided: in late August 1388, the royal host set out. The campaign was hampered by geography and the season, and ended with a negotiated submission (October 1388): the objective was above all political — to show that the king could mount a major operation.


👑 All Saints’ Day 1388: The Signal of Personal Rule

On his return, the scene was highly symbolic: Charles VI held a great assembly at Reims, the city of his coronation. He was approaching the age at which he could govern without tutelage. A few weeks later, he set aside part of the princely influence and recalled advisers from the administration of Charles V.


🧠 Key Takeaways

  • Brittany and Guelders show that the state had to arbitrate between princes, peripheries, and diplomacy.
  • 1388 marks a shift: the monarchy tried to reassert a government of the state, less princely in character. browser.mjs?v=31225b66:48 ssr:error [request error] [unhandled] [GET] http://localhost/api/periods/p5/chapters?lang=fr

ℹ Error: [GET] “/content/content.json”: 404 Page not found: /content/content.json

⁃ at async $fetch2 (node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs:332:15) ⁃ at async Object.handler (server/api/periods/[pid]/chapters.get.ts:32:31)

27 ┃ "public, max-age=300, s-maxage=3600, stale-while-revalidate=86400", 28 ┃ ); 29 ┃ const pid = getRouterParam(event, "pid") || ""; 30 ┃ const q = getQuery(event); 31 ┃ const lang = normalizeLang((q as any)?.lang); ❯ 32 ┃ const { PERIOD_CAROUSELS } = await getContentData(event); 33 ┃ const options = PERIOD_CAROUSELS[pid] || []; 34 ┃ const ready = options.length > 0 || PERIOD_FULL_UNLOCK.has(pid); 35 ┃ if (!ready) 36 ┃ throw createError({ statusCode: 404, statusMessage: "Coming soon" }); 37 ┃ const base = localizePeriodMeta(getPeriodMeta(pid), lang);

⁃ (async file://node_modules/h3/dist/index.mjs:2011:19) ⁃ at async Object.callAsync (node_modules/unctx/dist/index.mjs:72:16) ⁃ at async toNodeHandle (node_modules/h3/dist/index.mjs:2303:7) ⁃ at async b (node_modules/node-mock-http/dist/index.mjs:1:6876) ⁃ at async C (node_modules/node-mock-http/dist/index.mjs:1:7159) ⁃ at async $fetchRaw2 (node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs:274:26) ⁃ at async $fetch2 (node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs:332:15) ⁃ at async setup (pages/p/[pid]/index.vue:49:18)

[CAUSE] FetchError { stack: ’[GET] “/content/content.json”: 404 Page not found: /content/content.json\n’ + ‘at async $fetch2 (./node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs:332:15)\n’ + ‘at async Object.handler (./server/api/periods/[pid]/chapters.get.ts:32:31)\n’ + ‘at async file://./node_modules/h3/dist/index.mjs:2011:19)\n’ + ‘at async Object.callAsync (./node_modules/unctx/dist/index.mjs:72:16)\n’ + ‘at async toNodeHandle (./node_modules/h3/dist/index.mjs:2303:7)\n’ + ‘at async b (./node_modules/node-mock-http/dist/index.mjs:1:6876)\n’ + ‘at async C (./node_modules/node-mock-http/dist/index.mjs:1:7159)\n’ + ‘at async $fetchRaw2 (./node_modules/ofetch/dist/shared/ofetch.CWycOUEr.mjs:274:26)\n’ + ‘at async $fetch2 (/Users/long2x/projects/france’… 161 more characters, message: ’[GET] “/content/content.json”: 404 Page not found: /content/content.json’, name: ’FetchError’, request: [Getter] options: [Getter] response: [Getter] data: [Getter] status: [Getter] statusCode: [Getter] statusText: [Getter] statusMessage: [Getter] }

runtime-core.esm-bun….js?v=31225b66:7189 <Suspense> is an experimental feature and its API will likely change. devtools.client.js?v=31225b66:52 ✨ Nuxt DevTools Press Shift + Option + D to open DevTools p5-le-moyen-age-classique:1 Access to XMLHttpRequest at ‘https://cloudflareinsights.com/cdn-cgi/rum’ from origin ‘http://localhost:3003’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: The ‘Access-Control-Allow-Origin’ header has a value ‘http://localhost’ that is not equal to the supplied origin. beacon.min.js:1 POST https://cloudflareinsights.com/cdn-cgi/rum net::ERR_FAILED runtime-core.esm-bun…er.js?v=31225b66:50 [Vue warn]: Hydration node mismatch:

  • rendered on server:
  • expected on client: Symbol(v-fgt) at <Breadcrumb model= (2) [{…}, {…}]

    at <Default ref=Ref< undefined > > at <AsyncComponentWrapper ref=Ref< undefined > > at <LayoutLoader key=“default” layoutProps= {ref: RefImpl} name=“default” > at <NuxtLayoutProvider layoutProps= {ref: RefImpl} key=“default” name=“default” … > at <NuxtLayout > at <App key=4 > at <NuxtRoot> runtime-core.esm-bun….js?v=31225b66:1873 Hydration completed but contains mismatches. p5-le-moyen-age-classique:1 Access to resource at ‘https://cloudflareinsights.com/cdn-cgi/rum’ from origin ‘http://localhost:3003’ has been blocked by CORS policy: Response to preflight request doesn’t pass access control check: The ‘Access-Control-Allow-Origin’ header has a value ‘http://localhost’ that is not equal to the supplied origin. beacon.min.js:1 POST https://cloudflareinsights.com/cdn-cgi/rum net::ERR_FAILED