glideshow 0.2.0__tar.gz → 0.2.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. {glideshow-0.2.0 → glideshow-0.2.2}/PKG-INFO +1 -1
  2. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/auth.js +15 -2
  3. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/pages.js +23 -6
  4. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/worker.js +3 -1
  5. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/__init__.py +1 -1
  6. {glideshow-0.2.0 → glideshow-0.2.2}/pyproject.toml +1 -1
  7. {glideshow-0.2.0 → glideshow-0.2.2}/uv.lock +1 -1
  8. {glideshow-0.2.0 → glideshow-0.2.2}/.github/workflows/checks.yml +0 -0
  9. {glideshow-0.2.0 → glideshow-0.2.2}/.github/workflows/release.yml +0 -0
  10. {glideshow-0.2.0 → glideshow-0.2.2}/.github/workflows/staging.yml +0 -0
  11. {glideshow-0.2.0 → glideshow-0.2.2}/.github/workflows/tests.yml +0 -0
  12. {glideshow-0.2.0 → glideshow-0.2.2}/.gitignore +0 -0
  13. {glideshow-0.2.0 → glideshow-0.2.2}/LICENSE +0 -0
  14. {glideshow-0.2.0 → glideshow-0.2.2}/README.md +0 -0
  15. {glideshow-0.2.0 → glideshow-0.2.2}/bin/glideshow +0 -0
  16. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/clean.js +0 -0
  17. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/env.d.ts +0 -0
  18. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/github-app.py +0 -0
  19. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/library.js +0 -0
  20. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/setup.sh +0 -0
  21. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/share.js +0 -0
  22. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/store-drive.js +0 -0
  23. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/store-github.js +0 -0
  24. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/tsconfig.json +0 -0
  25. {glideshow-0.2.0 → glideshow-0.2.2}/cloud/wrangler.toml +0 -0
  26. {glideshow-0.2.0 → glideshow-0.2.2}/docs/agents.md +0 -0
  27. {glideshow-0.2.0 → glideshow-0.2.2}/docs/deck-format.md +0 -0
  28. {glideshow-0.2.0 → glideshow-0.2.2}/docs/self-hosting.md +0 -0
  29. {glideshow-0.2.0 → glideshow-0.2.2}/docs/shortcuts.md +0 -0
  30. {glideshow-0.2.0 → glideshow-0.2.2}/editor/.assetsignore +0 -0
  31. {glideshow-0.2.0 → glideshow-0.2.2}/editor/apple-touch-icon.png +0 -0
  32. {glideshow-0.2.0 → glideshow-0.2.2}/editor/data/font-metrics.json +0 -0
  33. {glideshow-0.2.0 → glideshow-0.2.2}/editor/data/fonts.json +0 -0
  34. {glideshow-0.2.0 → glideshow-0.2.2}/editor/data/icons.json +0 -0
  35. {glideshow-0.2.0 → glideshow-0.2.2}/editor/data/symbols.js +0 -0
  36. {glideshow-0.2.0 → glideshow-0.2.2}/editor/data/themes.js +0 -0
  37. {glideshow-0.2.0 → glideshow-0.2.2}/editor/deck/base.css +0 -0
  38. {glideshow-0.2.0 → glideshow-0.2.2}/editor/deck/present.js +0 -0
  39. {glideshow-0.2.0 → glideshow-0.2.2}/editor/deck/shapes.js +0 -0
  40. {glideshow-0.2.0 → glideshow-0.2.2}/editor/deck/template.html +0 -0
  41. {glideshow-0.2.0 → glideshow-0.2.2}/editor/editor.css +0 -0
  42. {glideshow-0.2.0 → glideshow-0.2.2}/editor/glideshow-1024.png +0 -0
  43. {glideshow-0.2.0 → glideshow-0.2.2}/editor/glideshow.svg +0 -0
  44. {glideshow-0.2.0 → glideshow-0.2.2}/editor/globals.d.ts +0 -0
  45. {glideshow-0.2.0 → glideshow-0.2.2}/editor/home.html +0 -0
  46. {glideshow-0.2.0 → glideshow-0.2.2}/editor/index.html +0 -0
  47. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/arrange.js +0 -0
  48. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/boot.js +0 -0
  49. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/boxes.js +0 -0
  50. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/charts.js +0 -0
  51. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/comments.js +0 -0
  52. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/context-menus.js +0 -0
  53. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/dialogs.js +0 -0
  54. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/dock.js +0 -0
  55. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/draw.js +0 -0
  56. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/file.js +0 -0
  57. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/find.js +0 -0
  58. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/format-panel.js +0 -0
  59. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/geometry.js +0 -0
  60. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/guides.js +0 -0
  61. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/insert.js +0 -0
  62. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/keyboard.js +0 -0
  63. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/live.js +0 -0
  64. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/menubar.js +0 -0
  65. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/menus.js +0 -0
  66. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/motion.js +0 -0
  67. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/notes.js +0 -0
  68. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/objects.js +0 -0
  69. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/people.js +0 -0
  70. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/phone-comments.js +0 -0
  71. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/phone-edit.js +0 -0
  72. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/phone-home.js +0 -0
  73. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/phone-mode.js +0 -0
  74. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/phone-sheets.js +0 -0
  75. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/phone-touch.js +0 -0
  76. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/phone-view.js +0 -0
  77. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/pointer.js +0 -0
  78. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/render.js +0 -0
  79. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/shortcuts.js +0 -0
  80. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/slides.js +0 -0
  81. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/spacing.js +0 -0
  82. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/state.js +0 -0
  83. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/storage.js +0 -0
  84. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/text.js +0 -0
  85. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/theme-toggle.js +0 -0
  86. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/theme.js +0 -0
  87. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/toolbar-groups.js +0 -0
  88. {glideshow-0.2.0 → glideshow-0.2.2}/editor/js/toolbar.js +0 -0
  89. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/browser-db.js +0 -0
  90. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/library.js +0 -0
  91. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/merge.js +0 -0
  92. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/move-local.js +0 -0
  93. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/onefile.js +0 -0
  94. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/polygon-clipping.min.js +0 -0
  95. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/store-browser.js +0 -0
  96. {glideshow-0.2.0 → glideshow-0.2.2}/editor/lib/store-folder.js +0 -0
  97. {glideshow-0.2.0 → glideshow-0.2.2}/editor/local/sw.js +0 -0
  98. {glideshow-0.2.0 → glideshow-0.2.2}/editor/local/tsconfig.json +0 -0
  99. {glideshow-0.2.0 → glideshow-0.2.2}/editor/looks/glider.svg +0 -0
  100. {glideshow-0.2.0 → glideshow-0.2.2}/editor/looks/thermal-phone.css +0 -0
  101. {glideshow-0.2.0 → glideshow-0.2.2}/editor/looks/thermal.css +0 -0
  102. {glideshow-0.2.0 → glideshow-0.2.2}/editor/manifest.json +0 -0
  103. {glideshow-0.2.0 → glideshow-0.2.2}/editor/phone.css +0 -0
  104. {glideshow-0.2.0 → glideshow-0.2.2}/editor/share/share.css +0 -0
  105. {glideshow-0.2.0 → glideshow-0.2.2}/editor/share/share.js +0 -0
  106. {glideshow-0.2.0 → glideshow-0.2.2}/editor/share/speaker.html +0 -0
  107. {glideshow-0.2.0 → glideshow-0.2.2}/editor/tsconfig.json +0 -0
  108. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/__main__.py +0 -0
  109. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/agent.py +0 -0
  110. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/build.py +0 -0
  111. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/cli.py +0 -0
  112. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/comments.py +0 -0
  113. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/decks.py +0 -0
  114. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/figure.py +0 -0
  115. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/fonts.py +0 -0
  116. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/gslides.py +0 -0
  117. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/history.py +0 -0
  118. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/merge.py +0 -0
  119. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/movie.py +0 -0
  120. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/osutil.py +0 -0
  121. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/pptx_export.py +0 -0
  122. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/pptx_import.py +0 -0
  123. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/publish.py +0 -0
  124. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/render.py +0 -0
  125. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/server.py +0 -0
  126. {glideshow-0.2.0 → glideshow-0.2.2}/glideshow/service.py +0 -0
  127. {glideshow-0.2.0 → glideshow-0.2.2}/skills/glideshow/SKILL.md +0 -0
  128. {glideshow-0.2.0 → glideshow-0.2.2}/test/agent.py +0 -0
  129. {glideshow-0.2.0 → glideshow-0.2.2}/test/cloud.py +0 -0
  130. {glideshow-0.2.0 → glideshow-0.2.2}/test/coedit.py +0 -0
  131. {glideshow-0.2.0 → glideshow-0.2.2}/test/fake_drive.py +0 -0
  132. {glideshow-0.2.0 → glideshow-0.2.2}/test/fixtures/agent-deck.html +0 -0
  133. {glideshow-0.2.0 → glideshow-0.2.2}/test/fixtures/gslides-api.json +0 -0
  134. {glideshow-0.2.0 → glideshow-0.2.2}/test/fixtures/stack-deck.html +0 -0
  135. {glideshow-0.2.0 → glideshow-0.2.2}/test/keys.py +0 -0
  136. {glideshow-0.2.0 → glideshow-0.2.2}/test/media.py +0 -0
  137. {glideshow-0.2.0 → glideshow-0.2.2}/test/share.py +0 -0
  138. {glideshow-0.2.0 → glideshow-0.2.2}/test/smoke.py +0 -0
  139. {glideshow-0.2.0 → glideshow-0.2.2}/test/snap.py +0 -0
  140. {glideshow-0.2.0 → glideshow-0.2.2}/tools/check.sh +0 -0
  141. {glideshow-0.2.0 → glideshow-0.2.2}/tools/font_metrics.py +0 -0
  142. {glideshow-0.2.0 → glideshow-0.2.2}/tools/gslides2deck.py +0 -0
  143. {glideshow-0.2.0 → glideshow-0.2.2}/tools/make-app.sh +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: glideshow
3
- Version: 0.2.0
3
+ Version: 0.2.2
4
4
  Summary: Slides you own: a Google Slides-style editor whose decks are plain HTML folders that AI agents can edit
5
5
  Project-URL: Homepage, https://glideshow.org
6
6
  License-Expression: AGPL-3.0-or-later
@@ -188,11 +188,24 @@ const DARK = `--card: #1d1e25; --ink: #ececee; --muted: #a1a3aa; --line: #3a3b40
188
188
  --sky: radial-gradient(120% 140% at 88% 130%, rgba(226, 140, 112, .5) 0%, rgba(226, 140, 112, 0) 58%), radial-gradient(140% 70% at 15% 120%, rgba(150, 88, 140, .45) 0%, rgba(150, 88, 140, 0) 70%), linear-gradient(180deg, #18182c 0%, #221e41 50%, #2f2749 100%);
189
189
  --grain-blend: overlay; --grain: .2; color-scheme: dark;`; // dusk: the system's dark mode, or the switch in the corner
190
190
 
191
- export function page(title, body, status = 200) {
191
+ /* What search engines and link previews see, for the public pages only (opts.index); every other page stays noindex. */
192
+ const SITE = 'https://glideshow.org';
193
+ function meta(title, { index = false, path = '/', description = '', ld = null } = {}) {
194
+ if (!index) return '<meta name="robots" content="noindex">';
195
+ const d = esc(description), t = esc(title);
196
+ return `<meta name="description" content="${d}"><link rel="canonical" href="${SITE}${path}">
197
+ <meta property="og:type" content="website"><meta property="og:site_name" content="Glideshow"><meta property="og:title" content="${t}">
198
+ <meta property="og:description" content="${d}"><meta property="og:url" content="${SITE}${path}"><meta property="og:image" content="${SITE}/og.png">
199
+ <meta name="twitter:card" content="summary"><meta name="twitter:title" content="${t}"><meta name="twitter:description" content="${d}"><meta name="twitter:image" content="${SITE}/og.png">${ld ? `
200
+ <script type="application/ld+json">${JSON.stringify(ld).replace(/</g, '\\u003c')}</script>` : ''}`;
201
+ }
202
+
203
+ /** @param {string} title @param {string} body @param {number} [status] @param {{ index?: boolean, path?: string, description?: string, ld?: any, full?: string }} [opts] */
204
+ export function page(title, body, status = 200, opts = {}) {
192
205
  // Thermal's front page: the sky is the page itself (dusk in dark mode), one plain card, the mascot gliding above it
193
206
  const grain = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.5'/%3E%3C/svg%3E")`;
194
207
  return new Response(`<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
195
- <meta name="robots" content="noindex"><link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><title>${esc(title)} · Glideshow</title>
208
+ ${meta(opts.full || (title === 'Glideshow' ? title : title + ' · Glideshow'), opts)}<link rel="icon" href="/favicon.svg" type="image/svg+xml"><link rel="apple-touch-icon" href="/apple-touch-icon.png"><title>${esc(opts.full || (title === 'Glideshow' ? title : title + ' · Glideshow'))}</title>
196
209
  <script>try { const v = localStorage.getItem('slides-dark'); if (v) document.documentElement.dataset.theme = v === '1' ? 'dark' : 'light'; } catch {}</script>
197
210
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Hanken+Grotesk:wght@300;400;500;600&display=swap"><style>
198
211
  .stage { display: inline-block; margin-left: .5em; padding: .15em .55em; border-radius: 999px; background: var(--accent); color: var(--on-accent); font-size: .32em; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; vertical-align: .55em; } /* alpha (the front page) */
@@ -25,11 +25,17 @@ GitHub repo. You see every version, and AI agents can read and edit them with yo
25
25
  };
26
26
  }</script>
27
27
  <small>No account needed: your decks stay in this browser. Sign in with Google or GitHub to keep them in your Drive or a repo,
28
- and to share them. Glideshow is free and in early testing.</small>${foot}`);
28
+ and to share them. Glideshow is free and in early testing.</small>${foot}`, 200, {
29
+ index: true, path: '/', full: 'Glideshow: slides you own, as plain HTML files',
30
+ description: 'Glideshow is a free, open-source slide editor. Decks are plain HTML files you keep in a folder, your Google Drive or a GitHub repo, with every version saved. Import Google Slides and PowerPoint, share with a link, and edit with AI agents like Claude Code.',
31
+ ld: { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Glideshow', url: 'https://glideshow.org/',
32
+ applicationCategory: 'BusinessApplication', operatingSystem: 'Web, macOS, Linux, Windows', image: 'https://glideshow.org/og.png',
33
+ description: 'A free, open-source slide editor whose decks are plain HTML files you own.', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
34
+ sameAs: ['https://github.com/heyodog0/glideshow', 'https://pypi.org/project/glideshow/'] } });
29
35
  }
30
36
 
31
37
  export function privacy() {
32
- return page('Privacy policy', `<small>Last updated October 12, 2026</small>
38
+ return page('Privacy policy', `<small>Last updated November 1, 2026</small>
33
39
  <p><b>What Glideshow keeps.</b> When you sign in with GitHub: your GitHub user id, username and name. When you sign in with Google: your
34
40
  Google account id, name and email address. These go into a signed cookie in your browser (your session, for up to 90 days), not into a
35
41
  database of users. For someone who keeps decks here, Glideshow also remembers which GitHub repo holds them and their recently opened decks.
@@ -47,7 +53,8 @@ owner's repo or Drive, where the owner (and anyone with access to it) can see th
47
53
  <p><b>Reports.</b> If you report a shared deck, Glideshow keeps the report with your IP address and, if you give it, your email address, so
48
54
  the person running Glideshow can review it; reports are deleted once dealt with.</p>
49
55
  <p><b>What Glideshow doesn't do.</b> No ads, no tracking or analytics cookies, no selling or sharing of your information, and no use of your
50
- decks or comments to train AI models. Search engines and AI crawlers are asked to stay out (robots.txt and noindex, noai headers).</p>
56
+ decks or comments to train AI models. Search engines and AI crawlers are asked to stay out of everything but the home page, this
57
+ policy and the terms: no deck, shared or not, is indexed (robots.txt and noindex, noai headers).</p>
51
58
  <p><b>Google user data.</b> Glideshow's use and transfer of information received from Google APIs adheres to the
52
59
  <a href="https://developers.google.com/terms/api-services-user-data-policy">Google API Services User Data Policy</a>, including the Limited Use
53
60
  requirements: it is used only to sign you in and to keep your decks in your Drive, never for ads, never sold, and never read by people except
@@ -56,7 +63,7 @@ to keep the service secure or at your request.</p>
56
63
  for a few days; GitHub holds the decks; Google and GitHub handle sign-in.
57
64
  Their own privacy policies apply to them.</p>
58
65
  <p><b>Your choices.</b> Sign out anytime; remove the Glideshow app from your GitHub account (Settings → Applications) to cut its access to your
59
- repos; ask a deck's owner to delete your comments, or delete them yourself. Questions or deletion requests: <a href="mailto:${CONTACT}">${esc(CONTACT)}</a>.</p>${foot}`);
66
+ repos; ask a deck's owner to delete your comments, or delete them yourself. Questions or deletion requests: <a href="mailto:${CONTACT}">${esc(CONTACT)}</a>.</p>${foot}`, 200, { index: true, path: '/privacy', description: 'What Glideshow keeps about you and your decks, and what it never does.' });
60
67
  }
61
68
 
62
69
  export function terms() {
@@ -76,7 +83,17 @@ can be made per minute.</p>
76
83
  <p><b>Accounts.</b> Access can be suspended for misuse. You can stop using Glideshow at any time by signing out and removing its GitHub app.</p>
77
84
  <p><b>Liability.</b> To the extent the law allows, Glideshow and the person running it are not liable for any indirect or consequential loss,
78
85
  or loss of data, from using it.</p>
79
- <p>Contact: <a href="mailto:${CONTACT}">${esc(CONTACT)}</a>.</p>${foot}`);
86
+ <p>Contact: <a href="mailto:${CONTACT}">${esc(CONTACT)}</a>.</p>${foot}`, 200, { index: true, path: '/terms', description: 'The terms for using Glideshow, a free slide editor in early testing.' });
80
87
  }
81
88
 
82
- export const robots = 'User-agent: *\nAllow: /$\nAllow: /privacy\nAllow: /terms\nDisallow: /\n';
89
+ /* AI training crawlers are turned away by name (they honour their own names, not the noai headers); Google-Extended is
90
+ Gemini training only, so Google Search still indexes the public pages. Cloudflare's "Block AI bots" enforces it for the rest. */
91
+ const AI_BOTS = ['GPTBot', 'ClaudeBot', 'anthropic-ai', 'CCBot', 'Google-Extended', 'Applebot-Extended', 'meta-externalagent', 'FacebookBot',
92
+ 'Bytespider', 'Amazonbot', 'cohere-ai', 'cohere-training-data-crawler', 'Diffbot', 'omgili', 'PerplexityBot', 'AI2Bot', 'Timpibot'];
93
+ export const robots = AI_BOTS.map(b => `User-agent: ${b}\n`).join('') + 'Disallow: /\n\n' + 'User-agent: *\nAllow: /$\nAllow: /privacy\nAllow: /terms\nAllow: /og.png\nAllow: /sitemap.xml\nDisallow: /\n\nSitemap: https://glideshow.org/sitemap.xml\n';
94
+
95
+ export const sitemap = `<?xml version="1.0" encoding="UTF-8"?>
96
+ <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
97
+ ${['/', '/privacy', '/terms'].map(p => ` <url><loc>https://glideshow.org${p}</loc></url>`).join('\n')}
98
+ </urlset>
99
+ `;
@@ -12,7 +12,7 @@
12
12
  import { DurableObject } from 'cloudflare:workers';
13
13
  import { approvedFrom, cleanSlides, composeDeck, deckForCollaborator } from './clean.js';
14
14
  import { session, isOwner, isAdmin, libraryFor, githubStart, githubCallback, googleStart, googleCallback, devLogin, loginPage, page, esc, json, redirect, cookie, safeNext } from './auth.js';
15
- import { landing, privacy, terms, robots } from './pages.js';
15
+ import { landing, privacy, terms, robots, sitemap } from './pages.js';
16
16
  export { Library } from './library.js';
17
17
 
18
18
  export default {
@@ -52,6 +52,8 @@ const WHY = { shared: 'This deck is shared with specific people. Sign in to open
52
52
 
53
53
  async function route(req, env, url, path) {
54
54
  if (path === '/robots.txt') return new Response(robots, { headers: { 'content-type': 'text/plain' } });
55
+ if (path === '/sitemap.xml') return new Response(sitemap, { headers: { 'content-type': 'application/xml' } });
56
+ if (path === '/og.png') return env.ASSETS.fetch(new Request(new URL('/glideshow-1024.png', url.origin))); // the link-preview picture
55
57
  if (path === '/favicon.svg' || path === '/favicon.ico') return env.ASSETS.fetch(new Request(new URL('/glideshow.svg', url.origin))); // the mascot, for every page (/editor/ is behind sign-in)
56
58
  if (path === '/apple-touch-icon.png') return env.ASSETS.fetch(new Request(new URL(path, url.origin)));
57
59
  if (path === '/privacy') return privacy();
@@ -3,7 +3,7 @@
3
3
  import os
4
4
  from pathlib import Path
5
5
 
6
- __version__ = "0.1.2"
6
+ __version__ = "0.2.2"
7
7
 
8
8
  # Before it was Glideshow it was "slides": its environment variables (SLIDES_HOME, …) still work, and its folder of
9
9
  # settings (~/.slides) moves to ~/.glideshow the first time, leaving a link behind for anything still pointing there.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "glideshow"
3
- version = "0.2.0"
3
+ version = "0.2.2"
4
4
  description = "Slides you own: a Google Slides-style editor whose decks are plain HTML folders that AI agents can edit"
5
5
  license = "AGPL-3.0-or-later"
6
6
  license-files = ["LICENSE"]
@@ -4,7 +4,7 @@ requires-python = ">=3.10"
4
4
 
5
5
  [[package]]
6
6
  name = "glideshow"
7
- version = "0.2.0"
7
+ version = "0.2.2"
8
8
  source = { editable = "." }
9
9
 
10
10
  [package.optional-dependencies]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes