{"id":"69e6c2302f5a6f491bc78957","title":"2026 04 20","path":"how-to/committee/release-notes/2026-04-20","contentMarkdown":"# 20-Apr-2026 — Image Migration → Content Migration\n\n## GitHub [#206](https://github.com/nbarrett/ngx-ramblers/issues/206) — [commit 1529096](https://github.com/nbarrett/ngx-ramblers/commit/1529096d6687c5aaea720595c4973f57999a2986)\n\n_____\n\nThe admin migration tool now handles **all external document types** — PDFs, Word, Excel and other files — not just images. The admin menu and route are renamed from **Image Migration** to **Content Migration**, with the old URL redirecting automatically.\n\n## What's scanned\n\nThe scanner now picks up external URLs from:\n\n- markdown links `[text](https://ngx-ramblers.org.uk/url)`\n- HTML links `<a href>`\n- image tags and markdown images\n- `href` fields on content columns\n\nEach result is tagged with a document type (image, pdf, spreadsheet, document, other) and rendered with an appropriate coloured badge and icon.\n\n### Scan Results\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/63c9f512-397b-4fa1-8297-51714ab7db8b.jpg)\n\n*Scan Results for kentramblers.org.uk — 478 external items across 225 sources. Coloured badges distinguish PDFs from Word documents; Select All / Deselect All / Migrate N Selected Items live in the toolbar.*\n\n### Activity\n\n![](https://ngx-ramblers.org.uk/api/aws/s3/site-content/26979fbb-3bf4-46ff-88cd-6818c1652447.jpg)\n\n*The Activity tab streams each step of a migration in real time. PDFs download to S3 as-is (no resizing); HTTP failures are surfaced inline but don't halt the batch.*\n\n## Notes\n\n- Non-image files are uploaded to S3 as-is. \"Auto Resize Images\" only applies to images.\n- Link rewriting covers `<img>` / `![]()` and `<a href>` / `[text](https://ngx-ramblers.org.uk/url)` patterns, plus `column.href`.\n- The old `admin/image-migration` URL automatically redirects to `admin/content-migration`.\n- A deployment migration (`20260329000000`) renames the admin menu item automatically.\n\n## Renames (for contributors)\n\nEverything with \"image\" in its name has been broadened to \"content\":\n\n- **Components** — `ImageMigrationTab` → `ContentMigrationTab`; `ImageMigrationGroupComponent` → `ContentMigrationGroupComponent`\n- **Types** — `ExternalImageReference` → `ExternalContentReference` (adds `documentType`); new `ContentMigrationDocumentType` enum (`IMAGE`, `PDF`, `SPREADSHEET`, `DOCUMENT`, `OTHER`)\n- **Fields** — `images` → `items`, `totalImages` → `totalItems`, `processedImages` → `processedItems`, `currentImage` → `currentItem`, `migratedImages` → `migratedItems`, `failedImages` → `failedItems`\n- **Helpers** — `extractImageUrlsFromMarkdown` → `extractExternalUrlsFromText` (also matches links), `extractImagesFromColumn` → `extractUrlsFromColumn` (also scans `href`), `scanForExternalImages` → `scanForExternalContent`, `downloadExternalImage` → `downloadExternalContent`\n- **Websocket events** — `IMAGE_MIGRATION_*` → `CONTENT_MIGRATION_*`\n- **New helpers** — `documentTypeFromUrl()`, `isExternalDocumentUrl()`","contentHtml":"<h1>20-Apr-2026 — Image Migration → Content Migration</h1>\n<h2>GitHub <a href=\"https://github.com/nbarrett/ngx-ramblers/issues/206\">#206</a> — <a href=\"https://github.com/nbarrett/ngx-ramblers/commit/1529096d6687c5aaea720595c4973f57999a2986\">commit 1529096</a></h2>\n<hr>\n<p>The admin migration tool now handles <strong>all external document types</strong> — PDFs, Word, Excel and other files — not just images. The admin menu and route are renamed from <strong>Image Migration</strong> to <strong>Content Migration</strong>, with the old URL redirecting automatically.</p>\n<h2>What&#39;s scanned</h2>\n<p>The scanner now picks up external URLs from:</p>\n<ul>\n<li>markdown links <code>[text](https://ngx-ramblers.org.uk/url)</code></li>\n<li>HTML links <code>&lt;a href&gt;</code></li>\n<li>image tags and markdown images</li>\n<li><code>href</code> fields on content columns</li>\n</ul>\n<p>Each result is tagged with a document type (image, pdf, spreadsheet, document, other) and rendered with an appropriate coloured badge and icon.</p>\n<h3>Scan Results</h3>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/63c9f512-397b-4fa1-8297-51714ab7db8b.jpg\" alt=\"\"></p>\n<p><em>Scan Results for kentramblers.org.uk — 478 external items across 225 sources. Coloured badges distinguish PDFs from Word documents; Select All / Deselect All / Migrate N Selected Items live in the toolbar.</em></p>\n<h3>Activity</h3>\n<p><img src=\"https://ngx-ramblers.org.uk/api/aws/s3/site-content/26979fbb-3bf4-46ff-88cd-6818c1652447.jpg\" alt=\"\"></p>\n<p><em>The Activity tab streams each step of a migration in real time. PDFs download to S3 as-is (no resizing); HTTP failures are surfaced inline but don&#39;t halt the batch.</em></p>\n<h2>Notes</h2>\n<ul>\n<li>Non-image files are uploaded to S3 as-is. &quot;Auto Resize Images&quot; only applies to images.</li>\n<li>Link rewriting covers <code>&lt;img&gt;</code> / <code>![]()</code> and <code>&lt;a href&gt;</code> / <code>[text](https://ngx-ramblers.org.uk/url)</code> patterns, plus <code>column.href</code>.</li>\n<li>The old <code>admin/image-migration</code> URL automatically redirects to <code>admin/content-migration</code>.</li>\n<li>A deployment migration (<code>20260329000000</code>) renames the admin menu item automatically.</li>\n</ul>\n<h2>Renames (for contributors)</h2>\n<p>Everything with &quot;image&quot; in its name has been broadened to &quot;content&quot;:</p>\n<ul>\n<li><strong>Components</strong> — <code>ImageMigrationTab</code> → <code>ContentMigrationTab</code>; <code>ImageMigrationGroupComponent</code> → <code>ContentMigrationGroupComponent</code></li>\n<li><strong>Types</strong> — <code>ExternalImageReference</code> → <code>ExternalContentReference</code> (adds <code>documentType</code>); new <code>ContentMigrationDocumentType</code> enum (<code>IMAGE</code>, <code>PDF</code>, <code>SPREADSHEET</code>, <code>DOCUMENT</code>, <code>OTHER</code>)</li>\n<li><strong>Fields</strong> — <code>images</code> → <code>items</code>, <code>totalImages</code> → <code>totalItems</code>, <code>processedImages</code> → <code>processedItems</code>, <code>currentImage</code> → <code>currentItem</code>, <code>migratedImages</code> → <code>migratedItems</code>, <code>failedImages</code> → <code>failedItems</code></li>\n<li><strong>Helpers</strong> — <code>extractImageUrlsFromMarkdown</code> → <code>extractExternalUrlsFromText</code> (also matches links), <code>extractImagesFromColumn</code> → <code>extractUrlsFromColumn</code> (also scans <code>href</code>), <code>scanForExternalImages</code> → <code>scanForExternalContent</code>, <code>downloadExternalImage</code> → <code>downloadExternalContent</code></li>\n<li><strong>Websocket events</strong> — <code>IMAGE_MIGRATION_*</code> → <code>CONTENT_MIGRATION_*</code></li>\n<li><strong>New helpers</strong> — <code>documentTypeFromUrl()</code>, <code>isExternalDocumentUrl()</code></li>\n</ul>\n"}