{"id":455,"date":"2026-11-02T19:10:55","date_gmt":"2026-11-02T19:10:55","guid":{"rendered":"https:\/\/metrix-x.rraz.ca\/?p=455"},"modified":"2026-11-02T19:22:33","modified_gmt":"2026-11-02T19:22:33","slug":"image-light-table-user-guide","status":"publish","type":"post","link":"https:\/\/metrix-x.rraz.ca\/?p=455","title":{"rendered":"Image Light Table \u2014 user guide"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-456\" src=\"https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier-800x389.png\" alt=\"\" width=\"800\" height=\"389\" srcset=\"https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier-800x389.png 800w, https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier-1024x498.png 1024w, https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier-150x73.png 150w, https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier-768x374.png 768w, https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier-1536x747.png 1536w, https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier-904x440.png 904w, https:\/\/metrix-x.rraz.ca\/wp-content\/uploads\/kodachrome-magnifier.png 1706w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><br \/>\nby Ryan Raz<\/p>\n<p>1. What Light Table is<br \/>\nHigh Resolution image light table and slide show.<\/p>\n<p>See it running: My 1970s in Kodachrome 64 slides\u2014 <a href=\"https:\/\/rraz.ca\/kodachrome\/light-table\/\" target=\"_blank\" rel=\"noopener\">https:\/\/rraz.ca\/kodachrome\/light-table\/<\/a>. That gallery is shown as a live example of the light table; it is not part of the package. The package can be found here: <a href=\"https:\/\/github.com\/RRaz\/Light-Table\">https:\/\/github.com\/RRaz\/Light-Table<\/a><\/p>\n<p>2. What it does<br \/>\nFully featured, including a magnifying loupe and the thumbnail strip.<br \/>\nIn slide show mode the image expands to take up the whole screen, apart from the controls.<br \/>\nSelf-contained, so installation is not restricted by the host: any web server that can serve files will run it, and the folder you upload holds the page, its files and the photographs. There is no database, no PHP, Node or Python on the server, and no setup program.<br \/>\nYour photographs stay yours. Building a gallery and viewing it send no photograph to any cloud service. Everything happens on your own host, under your own account.<br \/>\n3. The light table in use<br \/>\nMy 1970s in Kodachrome, shown with the magnifier open at 2x<\/p>\n<p>The magnifier is open at 2\u00d7 in this capture: the lens follows the pointer across the photograph, and the buttons beside it switch to 4\u00d7 and 8\u00d7. The thumbnail strip along the bottom is where photographs are chosen for the slide show.<\/p>\n<p>My 1970s in Kodachrome<\/p>\n<p>4. What you receive<br \/>\nOne zip containing a single folder, named after the gallery. It includes a sample gallery of eight colour slides, so the light table can be checked before your own photographs are added:<\/p>\n<p>colours\/<br \/>\nlight-table\/<br \/>\nindex.html<br \/>\nassets\/<br \/>\ncolours\/<br \/>\ngallery.json<br \/>\n01-red.png<br \/>\n02-orange.png<br \/>\n&#8230;<br \/>\n08-violet.png<br \/>\nlight-table\/ is the app. It is the same in every gallery and is not edited.<br \/>\nthe inner folder, with the same name, holds the images and gallery.json \u2014 the list that says which photographs appear, in what order, with what captions. The sample colour slides are replaced by your photographs.<br \/>\nnothing else is required: no database, no server code, no installer.<br \/>\nThe two folders must keep those names and that relationship. light-table\/ looks for the gallery beside it.<\/p>\n<p>5. Installing<br \/>\nPut the whole container folder on your website, unchanged. That is the whole install: the folder is the light table.<\/p>\n<p>The address is:<\/p>\n<p>https:\/\/yoursite.com\/\/light-table\/<br \/>\nwith replaced by the folder name. The sample folder is colours, so its address is:<\/p>\n<p>https:\/\/yoursite.com\/colours\/light-table\/<br \/>\nThe folder name is also the heading above the photos; hyphens become spaces, so lake-simcoe is shown as Lake Simcoe. The folder can sit at the top level or in a subfolder \u2014 only the address changes.<\/p>\n<p>If your website accepts file uploads \u2014 FTP, a control panel File Manager, or the upload in your host&#8217;s dashboard \u2014 use the structure above exactly as it is.<\/p>\n<p>If your site is built with a page builder<br \/>\nA page builder usually will not let you upload index.html and assets\/, so the folder cannot live there. The gallery still works, in two steps:<\/p>\n<p>Put the folder somewhere that serves files. A spare folder on your hosting, a subdomain, or any host that only has to serve files will do. It does not need a database, PHP, Node or a build step, and it does not need developer tools or accounts.<br \/>\nOn the page, add the light table address with the builder&#8217;s Embed or HTML block. The light table then opens inside your page.<br \/>\nFor that second step use the explicit form of the address, so the light table knows which gallery to load:<\/p>\n<p>https:\/\/your-static-host.example\/colours\/light-table\/?gallery=\/colours<br \/>\nYou may want to keep each build as a dated zip (section 9), so the gallery can be replaced or rolled back without rebuilding it.<\/p>\n<p>Check it: open the address above. If the colour slides appear, it is installed.<\/p>\n<p>6. Opening it<br \/>\nhttps:\/\/yoursite.com\/colours\/light-table\/<br \/>\nhttps:\/\/yoursite.com\/colours\/light-table\/?gallery=\/colours<br \/>\nBoth open the same gallery. The ?gallery= form is the explicit one and is the safer choice when the light table is embedded in another page or loaded from a different folder; without it the light table works out the gallery from its own address. The live example in section 1 uses the short form.<\/p>\n<p>7. Changing the gallery<br \/>\nThere are two routes: send the folder back to be rebuilt, or edit it on the server without any tools. Both touch the same two things:<\/p>\n<p>the images, in the inner folder \u2014 colours\/colours\/ in the sample<br \/>\nthe list, gallery.json, beside them<br \/>\nThe whole file looks like this, with two photos in it:<\/p>\n<p>{<br \/>\n&#8220;updated&#8221;: &#8220;2026-10-29T23:12:05.766Z&#8221;,<br \/>\n&#8220;photos&#8221;: [<br \/>\n{<br \/>\n&#8220;id&#8221;: &#8220;01-first-photo&#8221;,<br \/>\n&#8220;url&#8221;: &#8220;.\/01-first-photo.jpg&#8221;,<br \/>\n&#8220;title&#8221;: &#8220;First photo&#8221;<br \/>\n},<br \/>\n{<br \/>\n&#8220;id&#8221;: &#8220;02-second-photo&#8221;,<br \/>\n&#8220;url&#8221;: &#8220;.\/02-second-photo.jpg&#8221;,<br \/>\n&#8220;title&#8221;: &#8220;Second photo&#8221;<br \/>\n}<br \/>\n]<br \/>\n}<br \/>\nLeave the outer braces, the &#8220;photos&#8221;: line and the two square brackets in place. The photo blocks go between the square brackets.<\/p>\n<p>The comma rule. Braces hold one photo. A comma separates it from the next one, and the last photo has no comma after it. That is the single thing that breaks a list.<\/p>\n<p>When you move a photo to a different place, take the whole block &#8211; from its { to its }, &#8211; not a line at a time. After moving:<\/p>\n<p>every block except the last ends with },<br \/>\nthe last block ends with }<br \/>\nno block ends with two commas, and none is missing one<br \/>\nWhat you can change in the list:<\/p>\n<p>Part What it does<br \/>\ntitle the caption under the photo<br \/>\nurl which image file the entry shows: the file name with .\/ in front<br \/>\nid the entry&#8217;s own name; no two entries may share one<br \/>\nthe order of the blocks the order the photos appear in<br \/>\nadding or removing a block adding or removing a photo from the gallery<br \/>\nupdated records when the list was last written. The build sets it on every rebuild, and the light table does not read it, so it can be left alone.<\/p>\n<p>The look of the light table &#8211; colours, sizes, buttons &#8211; is not in this file. It lives in the light-table\/ folder and is not edited by hand.<\/p>\n<p>If the page then says Unable to load gallery, the list is the first thing to check: a missing or doubled comma is almost always the cause.<\/p>\n<p>7.1 Titles come from the file name<br \/>\nOne way to change a caption is to rename the file. 01-dawn.jpg becomes 01 dawn; rename it to Dawn over the lake.jpg and the caption becomes Dawn over the lake. Spaces, capitals and punctuation in the file name are kept as typed.<\/p>\n<p>If a title was set by hand in gallery.json, the file name must still match url. Renaming the file breaks that link: the next rebuild drops the entry, adds a new one for the new name, and captions it with that name. A title set by hand does not survive a rename.<\/p>\n<p>7.2 Order<br \/>\nThe order of the blocks in gallery.json is the order shown, so there are two ways to arrange a gallery:<\/p>\n<p>By rebuilding: number the files 01-, 02-, 03- and rebuild. Sorting is natural, so 2- comes before 10-.<br \/>\nBy hand: move the blocks in gallery.json into the order you want. The file names do not matter for this.<br \/>\nOne trap: renaming a single file makes it a new entry, and a rebuild appends new entries at the end. Rename all of them, or fix the order by hand afterwards.<\/p>\n<p>7.3 Adding a photo<br \/>\nRebuilding: drop the file into the image folder and rebuild. It is added at the end, then can be moved.<br \/>\nBy hand: copy the last block in gallery.json, change id, url and title to the new file, and move the block to where it should appear. Upload the image as well.<br \/>\n7.4 Deleting a photo<br \/>\nDelete its block from gallery.json and delete the image. Do both: an entry pointing at a missing file shows a broken photo, and an image with no entry never appears.<\/p>\n<p>7.5 More than one gallery<br \/>\nEach gallery is a self-contained folder with its own light-table\/. They are updated independently, and one gallery can be replaced without touching another.<\/p>\n<p>8. Updating a live gallery<br \/>\nKeep a copy of the current folder before changing anything.<br \/>\nReplace the images and gallery.json (or replace the whole folder).<br \/>\nOpen the page and hard-refresh (Ctrl+F5). Browsers cache gallery.json, so an old list can survive a normal reload.<br \/>\nIf an image still shows the old version, its file name is the cache key &#8211; renaming the file forces the new one to load.<br \/>\nGalleries published before the folder was renamed keep their old address: a small forwarding page is left behind, so links already in the wild still arrive at the gallery.<\/p>\n<p>9. Versions and rollback<br \/>\nName each build with a date, for example:<\/p>\n<p>light-table-colours-v2026-10-28.zip<br \/>\nKeep the current zip and the one before it.<br \/>\nTo roll back: delete the gallery folder on the server, upload the previous zip and extract it.<br \/>\nKeep zips out of the public web root, or delete them after extracting. A zip sitting on the server can be downloaded by anyone who guesses the name, and it contains the whole gallery.<br \/>\n10. If something is wrong<br \/>\nWhat you see What it usually means<br \/>\n&#8220;Unable to load gallery&#8221; gallery.json is not where the light table expects it; check the two folder names<br \/>\n&#8220;Unable to load gallery&#8221; after editing the list a comma is missing, doubled, or left after the last block<br \/>\nA blank frame assets\/ was not uploaded beside index.html<br \/>\nSome photos missing They are not listed in gallery.json, or the file name case differs from the entry<br \/>\nAn old photo, or an old title Browser cache \u2014 hard-refresh, or rename the file<br \/>\nWorks on your computer, not online Paths are relative; check that the inner folder was uploaded too<br \/>\n11. Notes for maintaining gallery<br \/>\nCheck how the site is updated before promising anything. FTP, a control panel, or a page builder that cannot host files at all \u2014 section 5 covers what to look for.<br \/>\nDecide who rebuilds after new photos. If the person who built the gallery does it, sections 7.2 to 7.4 shrink to &#8220;send the folder back&#8221;, and the recipient never edits gallery.json.<br \/>\nOne folder per gallery. It keeps them apart, so one can be replaced without touching the others; the cost is that a light table fix is uploaded once per gallery.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>by Ryan Raz 1. What Light Table is High Resolution image light table and slide show. See it running: My 1970s in Kodachrome 64 slides\u2014 https:\/\/rraz.ca\/kodachrome\/light-table\/. That gallery is shown as a live example of the light table; it is not part of the package. The package can be found here: https:\/\/github.com\/RRaz\/Light-Table 2. What it [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-455","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=\/wp\/v2\/posts\/455","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=455"}],"version-history":[{"count":2,"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=\/wp\/v2\/posts\/455\/revisions"}],"predecessor-version":[{"id":458,"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=\/wp\/v2\/posts\/455\/revisions\/458"}],"wp:attachment":[{"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=455"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=455"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/metrix-x.rraz.ca\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=455"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}