codex 2.0.0a5__tar.gz โ†’ 2.0.0a7__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 (1599) hide show
  1. codex-2.0.0a7/PKG-INFO +1041 -0
  2. codex-2.0.0a7/bun.lock +1248 -0
  3. codex-2.0.0a7/codex/choices/jobs.py +461 -0
  4. codex-2.0.0a7/codex/librarian/fs/poller/snapshot.py +233 -0
  5. codex-2.0.0a7/codex/librarian/fs/poller/snapshot_diff.py +305 -0
  6. codex-2.0.0a7/codex/librarian/librariand.py +214 -0
  7. codex-2.0.0a7/codex/librarian/scribe/janitor/integrity/__init__.py +134 -0
  8. codex-2.0.0a7/codex/librarian/scribe/janitor/integrity/foreign_keys.py +602 -0
  9. codex-2.0.0a7/codex/librarian/scribe/janitor/janitor.py +176 -0
  10. codex-2.0.0a7/codex/librarian/scribe/janitor/status.py +205 -0
  11. codex-2.0.0a7/codex/librarian/scribe/janitor/tasks.py +91 -0
  12. codex-2.0.0a7/codex/migrations/0043_comicbox_tagging_defaults.py +1110 -0
  13. codex-2.0.0a7/codex/static/assets/VCard-DYcGVXAi.js +1 -0
  14. codex-2.0.0a7/codex/static/assets/VCard-DYcGVXAi.js.br +0 -0
  15. codex-2.0.0a7/codex/static/assets/VCard-DYcGVXAi.js.gz +0 -0
  16. codex-2.0.0a7/codex/static/assets/VCheckbox-ND3VGyhh.js +1 -0
  17. codex-2.0.0a7/codex/static/assets/VCheckbox-ND3VGyhh.js.br +0 -0
  18. codex-2.0.0a7/codex/static/assets/VCheckbox-ND3VGyhh.js.gz +0 -0
  19. codex-2.0.0a7/codex/static/assets/VChip-DxJyUqn1.js +1 -0
  20. codex-2.0.0a7/codex/static/assets/VChip-DxJyUqn1.js.br +0 -0
  21. codex-2.0.0a7/codex/static/assets/VChip-DxJyUqn1.js.gz +0 -0
  22. codex-2.0.0a7/codex/static/assets/VCombobox-BLwaiSeV.js +2 -0
  23. codex-2.0.0a7/codex/static/assets/VCombobox-BLwaiSeV.js.br +0 -0
  24. codex-2.0.0a7/codex/static/assets/VCombobox-BLwaiSeV.js.gz +0 -0
  25. codex-2.0.0a7/codex/static/assets/VExpansionPanels-vS90xCA7.js +1 -0
  26. codex-2.0.0a7/codex/static/assets/VExpansionPanels-vS90xCA7.js.br +0 -0
  27. codex-2.0.0a7/codex/static/assets/VExpansionPanels-vS90xCA7.js.gz +0 -0
  28. codex-2.0.0a7/codex/static/assets/VForm-CwpDLk14.js +1 -0
  29. codex-2.0.0a7/codex/static/assets/VForm-CwpDLk14.js.br +0 -0
  30. codex-2.0.0a7/codex/static/assets/VForm-CwpDLk14.js.gz +0 -0
  31. codex-2.0.0a7/codex/static/assets/VRadioGroup-Fwb9RnPx.js +1 -0
  32. codex-2.0.0a7/codex/static/assets/VRadioGroup-Fwb9RnPx.js.br +0 -0
  33. codex-2.0.0a7/codex/static/assets/VRadioGroup-Fwb9RnPx.js.gz +0 -0
  34. codex-2.0.0a7/codex/static/assets/VSelect-DoCbptxg.js +1 -0
  35. codex-2.0.0a7/codex/static/assets/VSelect-DoCbptxg.js.br +0 -0
  36. codex-2.0.0a7/codex/static/assets/VSelect-DoCbptxg.js.gz +0 -0
  37. codex-2.0.0a7/codex/static/assets/VSelectionControl-Dkm-ze_e.js +1 -0
  38. codex-2.0.0a7/codex/static/assets/VSelectionControl-Dkm-ze_e.js.br +0 -0
  39. codex-2.0.0a7/codex/static/assets/VSelectionControl-Dkm-ze_e.js.gz +0 -0
  40. codex-2.0.0a7/codex/static/assets/VTextField-Blir5Apo.js +1 -0
  41. codex-2.0.0a7/codex/static/assets/VTextField-Blir5Apo.js.br +0 -0
  42. codex-2.0.0a7/codex/static/assets/VTextField-Blir5Apo.js.gz +0 -0
  43. codex-2.0.0a7/codex/static/assets/action-bar-B8lGr-MH.js +1 -0
  44. codex-2.0.0a7/codex/static/assets/action-bar-B8lGr-MH.js.br +0 -0
  45. codex-2.0.0a7/codex/static/assets/action-bar-B8lGr-MH.js.gz +0 -0
  46. codex-2.0.0a7/codex/static/assets/action-bar-K7HMjb42.css +1 -0
  47. codex-2.0.0a7/codex/static/assets/action-bar-K7HMjb42.css.br +0 -0
  48. codex-2.0.0a7/codex/static/assets/action-bar-K7HMjb42.css.gz +0 -0
  49. codex-2.0.0a7/codex/static/assets/admin-DQQJ1JXm.js +1 -0
  50. codex-2.0.0a7/codex/static/assets/admin-DQQJ1JXm.js.br +0 -0
  51. codex-2.0.0a7/codex/static/assets/admin-DQQJ1JXm.js.gz +0 -0
  52. codex-2.0.0a7/codex/static/assets/admin-DqVLB2tn.js +1 -0
  53. codex-2.0.0a7/codex/static/assets/admin-DqVLB2tn.js.br +0 -0
  54. codex-2.0.0a7/codex/static/assets/admin-DqVLB2tn.js.gz +0 -0
  55. codex-2.0.0a7/codex/static/assets/admin-menu-BJi9ErUS.js +1 -0
  56. codex-2.0.0a7/codex/static/assets/admin-menu-BJi9ErUS.js.br +0 -0
  57. codex-2.0.0a7/codex/static/assets/admin-menu-BJi9ErUS.js.gz +0 -0
  58. codex-2.0.0a7/codex/static/assets/admin-section-BssvM8Fa.css +1 -0
  59. codex-2.0.0a7/codex/static/assets/admin-section-BssvM8Fa.css.br +0 -0
  60. codex-2.0.0a7/codex/static/assets/admin-section-BssvM8Fa.css.gz +0 -0
  61. codex-2.0.0a7/codex/static/assets/admin-section-CESP54Nm.js +1 -0
  62. codex-2.0.0a7/codex/static/assets/admin-section-CESP54Nm.js.br +3 -0
  63. codex-2.0.0a7/codex/static/assets/admin-section-CESP54Nm.js.gz +0 -0
  64. codex-2.0.0a7/codex/static/assets/admin-settings-button-errors-CaqcifGP.js +1 -0
  65. codex-2.0.0a7/codex/static/assets/admin-settings-button-errors-CaqcifGP.js.br +0 -0
  66. codex-2.0.0a7/codex/static/assets/admin-settings-button-errors-CaqcifGP.js.gz +0 -0
  67. codex-2.0.0a7/codex/static/assets/admin-settings-button-progress-CnBni4Bw.js +1 -0
  68. codex-2.0.0a7/codex/static/assets/admin-settings-button-progress-CnBni4Bw.js.br +0 -0
  69. codex-2.0.0a7/codex/static/assets/admin-settings-button-progress-CnBni4Bw.js.gz +0 -0
  70. codex-2.0.0a7/codex/static/assets/admin-settings-button-prompts-BlpE5AZq.js +1 -0
  71. codex-2.0.0a7/codex/static/assets/admin-settings-button-prompts-BlpE5AZq.js.br +0 -0
  72. codex-2.0.0a7/codex/static/assets/admin-settings-button-prompts-BlpE5AZq.js.gz +0 -0
  73. codex-2.0.0a7/codex/static/assets/auth-GXG_6ZLA.js +1 -0
  74. codex-2.0.0a7/codex/static/assets/auth-GXG_6ZLA.js.br +0 -0
  75. codex-2.0.0a7/codex/static/assets/auth-GXG_6ZLA.js.gz +0 -0
  76. codex-2.0.0a7/codex/static/assets/browser-NmH9Aws0.js +1 -0
  77. codex-2.0.0a7/codex/static/assets/browser-NmH9Aws0.js.br +0 -0
  78. codex-2.0.0a7/codex/static/assets/browser-NmH9Aws0.js.gz +0 -0
  79. codex-2.0.0a7/codex/static/assets/clipboard-DQr6FzKE.js +1 -0
  80. codex-2.0.0a7/codex/static/assets/clipboard-DQr6FzKE.js.br +0 -0
  81. codex-2.0.0a7/codex/static/assets/clipboard-DQr6FzKE.js.gz +0 -0
  82. codex-2.0.0a7/codex/static/assets/close-button-C9Yk6CMD.js +1 -0
  83. codex-2.0.0a7/codex/static/assets/close-button-C9Yk6CMD.js.br +0 -0
  84. codex-2.0.0a7/codex/static/assets/close-button-C9Yk6CMD.js.gz +0 -0
  85. codex-2.0.0a7/codex/static/assets/confirm-dialog-SCc1t_VJ.js +1 -0
  86. codex-2.0.0a7/codex/static/assets/confirm-dialog-SCc1t_VJ.js.br +0 -0
  87. codex-2.0.0a7/codex/static/assets/confirm-dialog-SCc1t_VJ.js.gz +0 -0
  88. codex-2.0.0a7/codex/static/assets/custom-covers-tab-6FareBTJ.js +1 -0
  89. codex-2.0.0a7/codex/static/assets/custom-covers-tab-6FareBTJ.js.br +0 -0
  90. codex-2.0.0a7/codex/static/assets/custom-covers-tab-6FareBTJ.js.gz +0 -0
  91. codex-2.0.0a7/codex/static/assets/custom-covers-tab-L-QGNOCr.css +1 -0
  92. codex-2.0.0a7/codex/static/assets/custom-covers-tab-L-QGNOCr.css.br +0 -0
  93. codex-2.0.0a7/codex/static/assets/custom-covers-tab-L-QGNOCr.css.gz +0 -0
  94. codex-2.0.0a7/codex/static/assets/datetime-column-jP61VQKJ.js +1 -0
  95. codex-2.0.0a7/codex/static/assets/datetime-column-jP61VQKJ.js.br +0 -0
  96. codex-2.0.0a7/codex/static/assets/datetime-column-jP61VQKJ.js.gz +0 -0
  97. codex-2.0.0a7/codex/static/assets/delete-row-dialog-Ba8yd5wB.js +1 -0
  98. codex-2.0.0a7/codex/static/assets/delete-row-dialog-Ba8yd5wB.js.br +0 -0
  99. codex-2.0.0a7/codex/static/assets/delete-row-dialog-Ba8yd5wB.js.gz +0 -0
  100. codex-2.0.0a7/codex/static/assets/edit-panel-D-gxNk_T.js +1 -0
  101. codex-2.0.0a7/codex/static/assets/edit-panel-D-gxNk_T.js.br +0 -0
  102. codex-2.0.0a7/codex/static/assets/edit-panel-D-gxNk_T.js.gz +0 -0
  103. codex-2.0.0a7/codex/static/assets/email-tab-C4y45b7P.js +1 -0
  104. codex-2.0.0a7/codex/static/assets/email-tab-C4y45b7P.js.br +0 -0
  105. codex-2.0.0a7/codex/static/assets/email-tab-C4y45b7P.js.gz +0 -0
  106. codex-2.0.0a7/codex/static/assets/email-tab-DM3A3vTK.css +1 -0
  107. codex-2.0.0a7/codex/static/assets/email-tab-DM3A3vTK.css.br +0 -0
  108. codex-2.0.0a7/codex/static/assets/email-tab-DM3A3vTK.css.gz +0 -0
  109. codex-2.0.0a7/codex/static/assets/expand-toggle-C40yXgdK.js +1 -0
  110. codex-2.0.0a7/codex/static/assets/expand-toggle-C40yXgdK.js.br +0 -0
  111. codex-2.0.0a7/codex/static/assets/expand-toggle-C40yXgdK.js.gz +0 -0
  112. codex-2.0.0a7/codex/static/assets/expand-toggle-Dv1rmLCG.css +1 -0
  113. codex-2.0.0a7/codex/static/assets/expand-toggle-Dv1rmLCG.css.br +0 -0
  114. codex-2.0.0a7/codex/static/assets/expand-toggle-Dv1rmLCG.css.gz +0 -0
  115. codex-2.0.0a7/codex/static/assets/flag-card-B8Kw1iR-.css +1 -0
  116. codex-2.0.0a7/codex/static/assets/flag-card-B8Kw1iR-.css.br +0 -0
  117. codex-2.0.0a7/codex/static/assets/flag-card-B8Kw1iR-.css.gz +0 -0
  118. codex-2.0.0a7/codex/static/assets/flag-card-BhT3xpP1.js +1 -0
  119. codex-2.0.0a7/codex/static/assets/flag-card-BhT3xpP1.js.br +0 -0
  120. codex-2.0.0a7/codex/static/assets/flag-card-BhT3xpP1.js.gz +0 -0
  121. codex-2.0.0a7/codex/static/assets/group-tab-C4gE3f7G.js +1 -0
  122. codex-2.0.0a7/codex/static/assets/group-tab-C4gE3f7G.js.br +0 -0
  123. codex-2.0.0a7/codex/static/assets/group-tab-C4gE3f7G.js.gz +0 -0
  124. codex-2.0.0a7/codex/static/assets/group-tab-wc90p-27.css +1 -0
  125. codex-2.0.0a7/codex/static/assets/group-tab-wc90p-27.css.br +0 -0
  126. codex-2.0.0a7/codex/static/assets/group-tab-wc90p-27.css.gz +0 -0
  127. codex-2.0.0a7/codex/static/assets/http-error-DKwPK3x5.js +1 -0
  128. codex-2.0.0a7/codex/static/assets/http-error-DKwPK3x5.js.br +0 -0
  129. codex-2.0.0a7/codex/static/assets/http-error-DKwPK3x5.js.gz +0 -0
  130. codex-2.0.0a7/codex/static/assets/job-tab-B4Jtxg4A.css +1 -0
  131. codex-2.0.0a7/codex/static/assets/job-tab-B4Jtxg4A.css.br +0 -0
  132. codex-2.0.0a7/codex/static/assets/job-tab-B4Jtxg4A.css.gz +0 -0
  133. codex-2.0.0a7/codex/static/assets/job-tab-DRcHDhkd.js +1 -0
  134. codex-2.0.0a7/codex/static/assets/job-tab-DRcHDhkd.js.br +0 -0
  135. codex-2.0.0a7/codex/static/assets/job-tab-DRcHDhkd.js.gz +0 -0
  136. codex-2.0.0a7/codex/static/assets/library-tab-DEFEBA7k.js +1 -0
  137. codex-2.0.0a7/codex/static/assets/library-tab-DEFEBA7k.js.br +0 -0
  138. codex-2.0.0a7/codex/static/assets/library-tab-DEFEBA7k.js.gz +0 -0
  139. codex-2.0.0a7/codex/static/assets/library-tab-Mm9Udezb.css +1 -0
  140. codex-2.0.0a7/codex/static/assets/library-tab-Mm9Udezb.css.br +0 -0
  141. codex-2.0.0a7/codex/static/assets/library-tab-Mm9Udezb.css.gz +0 -0
  142. codex-2.0.0a7/codex/static/assets/main-C9y1Lpuo.js +6 -0
  143. codex-2.0.0a7/codex/static/assets/main-C9y1Lpuo.js.br +0 -0
  144. codex-2.0.0a7/codex/static/assets/main-C9y1Lpuo.js.gz +0 -0
  145. codex-2.0.0a7/codex/static/assets/pagination-toolbar-DiQjC6sH.js +2 -0
  146. codex-2.0.0a7/codex/static/assets/pagination-toolbar-DiQjC6sH.js.br +0 -0
  147. codex-2.0.0a7/codex/static/assets/pagination-toolbar-DiQjC6sH.js.gz +0 -0
  148. codex-2.0.0a7/codex/static/assets/pdf-doc-YE8G3JSa.js +378 -0
  149. codex-2.0.0a7/codex/static/assets/pdf-doc-YE8G3JSa.js.br +0 -0
  150. codex-2.0.0a7/codex/static/assets/pdf-doc-YE8G3JSa.js.gz +0 -0
  151. codex-2.0.0a7/codex/static/assets/prompt-popup-6qkIOhvM.js +2 -0
  152. codex-2.0.0a7/codex/static/assets/prompt-popup-6qkIOhvM.js.br +0 -0
  153. codex-2.0.0a7/codex/static/assets/prompt-popup-6qkIOhvM.js.gz +0 -0
  154. codex-2.0.0a7/codex/static/assets/reader-C4byFZUc.js +2 -0
  155. codex-2.0.0a7/codex/static/assets/reader-C4byFZUc.js.br +0 -0
  156. codex-2.0.0a7/codex/static/assets/reader-C4byFZUc.js.gz +0 -0
  157. codex-2.0.0a7/codex/static/assets/relation-chips-BLwBgx47.js +1 -0
  158. codex-2.0.0a7/codex/static/assets/relation-chips-BLwBgx47.js.br +0 -0
  159. codex-2.0.0a7/codex/static/assets/relation-chips-BLwBgx47.js.gz +0 -0
  160. codex-2.0.0a7/codex/static/assets/reset-password-confirm-o3nRvosJ.js +1 -0
  161. codex-2.0.0a7/codex/static/assets/reset-password-confirm-o3nRvosJ.js.br +0 -0
  162. codex-2.0.0a7/codex/static/assets/reset-password-confirm-o3nRvosJ.js.gz +0 -0
  163. codex-2.0.0a7/codex/static/assets/restore-tab-BurXkI1I.js +3 -0
  164. codex-2.0.0a7/codex/static/assets/restore-tab-BurXkI1I.js.br +0 -0
  165. codex-2.0.0a7/codex/static/assets/restore-tab-BurXkI1I.js.gz +0 -0
  166. codex-2.0.0a7/codex/static/assets/restore-tab-DSwRjlQF.css +1 -0
  167. codex-2.0.0a7/codex/static/assets/restore-tab-DSwRjlQF.css.br +0 -0
  168. codex-2.0.0a7/codex/static/assets/restore-tab-DSwRjlQF.css.gz +0 -0
  169. codex-2.0.0a7/codex/static/assets/settings-tab-BOY7sciX.js +1 -0
  170. codex-2.0.0a7/codex/static/assets/settings-tab-BOY7sciX.js.br +0 -0
  171. codex-2.0.0a7/codex/static/assets/settings-tab-BOY7sciX.js.gz +0 -0
  172. codex-2.0.0a7/codex/static/assets/settings-tab-DZDcFq57.css +1 -0
  173. codex-2.0.0a7/codex/static/assets/settings-tab-DZDcFq57.css.br +0 -0
  174. codex-2.0.0a7/codex/static/assets/settings-tab-DZDcFq57.css.gz +0 -0
  175. codex-2.0.0a7/codex/static/assets/stats-tab-BYEFoLNj.css +1 -0
  176. codex-2.0.0a7/codex/static/assets/stats-tab-BYEFoLNj.css.br +0 -0
  177. codex-2.0.0a7/codex/static/assets/stats-tab-BYEFoLNj.css.gz +0 -0
  178. codex-2.0.0a7/codex/static/assets/stats-tab-CFCluaFM.js +1 -0
  179. codex-2.0.0a7/codex/static/assets/stats-tab-CFCluaFM.js.br +0 -0
  180. codex-2.0.0a7/codex/static/assets/stats-tab-CFCluaFM.js.gz +0 -0
  181. codex-2.0.0a7/codex/static/assets/submit-footer-BrrmMwmM.js +1 -0
  182. codex-2.0.0a7/codex/static/assets/submit-footer-BrrmMwmM.js.br +0 -0
  183. codex-2.0.0a7/codex/static/assets/submit-footer-BrrmMwmM.js.gz +0 -0
  184. codex-2.0.0a7/codex/static/assets/tagging-tab-B6VNBF0j.js +1 -0
  185. codex-2.0.0a7/codex/static/assets/tagging-tab-B6VNBF0j.js.br +0 -0
  186. codex-2.0.0a7/codex/static/assets/tagging-tab-B6VNBF0j.js.gz +0 -0
  187. codex-2.0.0a7/codex/static/assets/tagging-tab-iH37M8fN.css +1 -0
  188. codex-2.0.0a7/codex/static/assets/tagging-tab-iH37M8fN.css.br +0 -0
  189. codex-2.0.0a7/codex/static/assets/tagging-tab-iH37M8fN.css.gz +0 -0
  190. codex-2.0.0a7/codex/static/assets/tooltip-nqXamkg1.js +1 -0
  191. codex-2.0.0a7/codex/static/assets/tooltip-nqXamkg1.js.br +0 -0
  192. codex-2.0.0a7/codex/static/assets/tooltip-nqXamkg1.js.gz +0 -0
  193. codex-2.0.0a7/codex/static/assets/unauthorized-C8FN5WqT.js +1 -0
  194. codex-2.0.0a7/codex/static/assets/unauthorized-C8FN5WqT.js.br +0 -0
  195. codex-2.0.0a7/codex/static/assets/unauthorized-C8FN5WqT.js.gz +0 -0
  196. codex-2.0.0a7/codex/static/assets/use-now-timer-DgjZw6f8.js +1 -0
  197. codex-2.0.0a7/codex/static/assets/use-now-timer-DgjZw6f8.js.br +0 -0
  198. codex-2.0.0a7/codex/static/assets/use-now-timer-DgjZw6f8.js.gz +0 -0
  199. codex-2.0.0a7/codex/static/assets/user-tab-BTo8p7iN.css +1 -0
  200. codex-2.0.0a7/codex/static/assets/user-tab-BTo8p7iN.css.br +0 -0
  201. codex-2.0.0a7/codex/static/assets/user-tab-BTo8p7iN.css.gz +0 -0
  202. codex-2.0.0a7/codex/static/assets/user-tab-Cm0HnmG0.js +1 -0
  203. codex-2.0.0a7/codex/static/assets/user-tab-Cm0HnmG0.js.br +0 -0
  204. codex-2.0.0a7/codex/static/assets/user-tab-Cm0HnmG0.js.gz +0 -0
  205. codex-2.0.0a7/codex/static/manifest.json +1102 -0
  206. codex-2.0.0a7/codex/static/manifest.json.br +0 -0
  207. codex-2.0.0a7/codex/static/manifest.json.gz +0 -0
  208. codex-2.0.0a7/codex/views/admin/identifier_parse.py +153 -0
  209. codex-2.0.0a7/codex/views/admin/tasks.py +209 -0
  210. codex-2.0.0a7/codex/views/browser/metadata/const.py +112 -0
  211. codex-2.0.0a7/codex/views/browser/metadata/copy_intersections.py +99 -0
  212. codex-2.0.0a7/codex/views/browser/paginate.py +115 -0
  213. codex-2.0.0a7/frontend/.eslintcache +1 -0
  214. codex-2.0.0a7/frontend/bun.lock +1145 -0
  215. codex-2.0.0a7/frontend/package.json +55 -0
  216. codex-2.0.0a7/frontend/src/choices/admin-jobs.json +435 -0
  217. codex-2.0.0a7/frontend/src/choices/admin-status-titles.json +63 -0
  218. codex-2.0.0a7/frontend/src/components/admin/tabs/admin-section.scss +232 -0
  219. codex-2.0.0a7/package.json +107 -0
  220. codex-2.0.0a7/pyproject.toml +419 -0
  221. codex-2.0.0a7/tests/test_janitor_folder_relations.py +200 -0
  222. codex-2.0.0a7/tests/test_metadata_path.py +160 -0
  223. codex-2.0.0a7/tests/test_snapshot_diff.py +286 -0
  224. codex-2.0.0a7/tests/test_tag_writer_progress.py +105 -0
  225. codex-2.0.0a7/uv.lock +4382 -0
  226. codex-2.0.0a5/PKG-INFO +0 -1041
  227. codex-2.0.0a5/bun.lock +0 -1248
  228. codex-2.0.0a5/codex/choices/jobs.py +0 -441
  229. codex-2.0.0a5/codex/librarian/fs/poller/snapshot.py +0 -211
  230. codex-2.0.0a5/codex/librarian/fs/poller/snapshot_diff.py +0 -292
  231. codex-2.0.0a5/codex/librarian/librariand.py +0 -212
  232. codex-2.0.0a5/codex/librarian/scribe/janitor/integrity/__init__.py +0 -120
  233. codex-2.0.0a5/codex/librarian/scribe/janitor/integrity/foreign_keys.py +0 -372
  234. codex-2.0.0a5/codex/librarian/scribe/janitor/janitor.py +0 -171
  235. codex-2.0.0a5/codex/librarian/scribe/janitor/status.py +0 -194
  236. codex-2.0.0a5/codex/librarian/scribe/janitor/tasks.py +0 -87
  237. codex-2.0.0a5/codex/migrations/0043_comicbox_tagging_defaults.py +0 -1090
  238. codex-2.0.0a5/codex/static/assets/VCard-DtzYH_Ua.js +0 -1
  239. codex-2.0.0a5/codex/static/assets/VCard-DtzYH_Ua.js.br +0 -0
  240. codex-2.0.0a5/codex/static/assets/VCard-DtzYH_Ua.js.gz +0 -0
  241. codex-2.0.0a5/codex/static/assets/VCheckbox-CpmMj4WU.js +0 -1
  242. codex-2.0.0a5/codex/static/assets/VCheckbox-CpmMj4WU.js.br +0 -0
  243. codex-2.0.0a5/codex/static/assets/VCheckbox-CpmMj4WU.js.gz +0 -0
  244. codex-2.0.0a5/codex/static/assets/VChip-CD6KFO4I.js +0 -1
  245. codex-2.0.0a5/codex/static/assets/VChip-CD6KFO4I.js.br +0 -0
  246. codex-2.0.0a5/codex/static/assets/VChip-CD6KFO4I.js.gz +0 -0
  247. codex-2.0.0a5/codex/static/assets/VCombobox-D9ytrlng.js +0 -2
  248. codex-2.0.0a5/codex/static/assets/VCombobox-D9ytrlng.js.br +0 -0
  249. codex-2.0.0a5/codex/static/assets/VCombobox-D9ytrlng.js.gz +0 -0
  250. codex-2.0.0a5/codex/static/assets/VExpansionPanels-BM5_ZV3-.js +0 -1
  251. codex-2.0.0a5/codex/static/assets/VExpansionPanels-BM5_ZV3-.js.br +0 -0
  252. codex-2.0.0a5/codex/static/assets/VExpansionPanels-BM5_ZV3-.js.gz +0 -0
  253. codex-2.0.0a5/codex/static/assets/VForm-x-sAEv-l.js +0 -1
  254. codex-2.0.0a5/codex/static/assets/VForm-x-sAEv-l.js.br +0 -0
  255. codex-2.0.0a5/codex/static/assets/VForm-x-sAEv-l.js.gz +0 -0
  256. codex-2.0.0a5/codex/static/assets/VRadioGroup-C24mqNwX.js +0 -1
  257. codex-2.0.0a5/codex/static/assets/VRadioGroup-C24mqNwX.js.br +0 -0
  258. codex-2.0.0a5/codex/static/assets/VRadioGroup-C24mqNwX.js.gz +0 -0
  259. codex-2.0.0a5/codex/static/assets/VSelect-DgdiAU4M.js +0 -1
  260. codex-2.0.0a5/codex/static/assets/VSelect-DgdiAU4M.js.br +0 -0
  261. codex-2.0.0a5/codex/static/assets/VSelect-DgdiAU4M.js.gz +0 -0
  262. codex-2.0.0a5/codex/static/assets/VSelectionControl-DwHr15NX.js +0 -1
  263. codex-2.0.0a5/codex/static/assets/VSelectionControl-DwHr15NX.js.br +0 -0
  264. codex-2.0.0a5/codex/static/assets/VSelectionControl-DwHr15NX.js.gz +0 -0
  265. codex-2.0.0a5/codex/static/assets/VTextField-PHKG8w0d.js +0 -1
  266. codex-2.0.0a5/codex/static/assets/VTextField-PHKG8w0d.js.br +0 -0
  267. codex-2.0.0a5/codex/static/assets/VTextField-PHKG8w0d.js.gz +0 -0
  268. codex-2.0.0a5/codex/static/assets/action-bar-Bwe9dr57.js +0 -1
  269. codex-2.0.0a5/codex/static/assets/action-bar-Bwe9dr57.js.br +0 -0
  270. codex-2.0.0a5/codex/static/assets/action-bar-Bwe9dr57.js.gz +0 -0
  271. codex-2.0.0a5/codex/static/assets/action-bar-aKyi5Oi9.css +0 -1
  272. codex-2.0.0a5/codex/static/assets/action-bar-aKyi5Oi9.css.br +0 -0
  273. codex-2.0.0a5/codex/static/assets/action-bar-aKyi5Oi9.css.gz +0 -0
  274. codex-2.0.0a5/codex/static/assets/admin--mNoZs1W.js +0 -1
  275. codex-2.0.0a5/codex/static/assets/admin--mNoZs1W.js.br +0 -0
  276. codex-2.0.0a5/codex/static/assets/admin--mNoZs1W.js.gz +0 -0
  277. codex-2.0.0a5/codex/static/assets/admin-menu-BqVzEpl2.js +0 -1
  278. codex-2.0.0a5/codex/static/assets/admin-menu-BqVzEpl2.js.br +0 -0
  279. codex-2.0.0a5/codex/static/assets/admin-menu-BqVzEpl2.js.gz +0 -0
  280. codex-2.0.0a5/codex/static/assets/admin-section-C4UIQD_6.css +0 -1
  281. codex-2.0.0a5/codex/static/assets/admin-section-C4UIQD_6.css.br +0 -0
  282. codex-2.0.0a5/codex/static/assets/admin-section-C4UIQD_6.css.gz +0 -0
  283. codex-2.0.0a5/codex/static/assets/admin-section-DpleizY0.js +0 -1
  284. codex-2.0.0a5/codex/static/assets/admin-section-DpleizY0.js.br +0 -0
  285. codex-2.0.0a5/codex/static/assets/admin-section-DpleizY0.js.gz +0 -0
  286. codex-2.0.0a5/codex/static/assets/admin-settings-button-errors-DuYaCVfe.js +0 -1
  287. codex-2.0.0a5/codex/static/assets/admin-settings-button-errors-DuYaCVfe.js.br +0 -0
  288. codex-2.0.0a5/codex/static/assets/admin-settings-button-errors-DuYaCVfe.js.gz +0 -0
  289. codex-2.0.0a5/codex/static/assets/admin-settings-button-progress-BcZoqjM-.js +0 -1
  290. codex-2.0.0a5/codex/static/assets/admin-settings-button-progress-BcZoqjM-.js.br +0 -0
  291. codex-2.0.0a5/codex/static/assets/admin-settings-button-progress-BcZoqjM-.js.gz +0 -0
  292. codex-2.0.0a5/codex/static/assets/admin-settings-button-prompts-CAt6NGcj.js +0 -1
  293. codex-2.0.0a5/codex/static/assets/admin-settings-button-prompts-CAt6NGcj.js.br +0 -4
  294. codex-2.0.0a5/codex/static/assets/admin-settings-button-prompts-CAt6NGcj.js.gz +0 -0
  295. codex-2.0.0a5/codex/static/assets/admin-yMOhMOgn.js +0 -1
  296. codex-2.0.0a5/codex/static/assets/admin-yMOhMOgn.js.br +0 -0
  297. codex-2.0.0a5/codex/static/assets/admin-yMOhMOgn.js.gz +0 -0
  298. codex-2.0.0a5/codex/static/assets/auth-BiJw_fhf.js +0 -1
  299. codex-2.0.0a5/codex/static/assets/auth-BiJw_fhf.js.br +0 -0
  300. codex-2.0.0a5/codex/static/assets/auth-BiJw_fhf.js.gz +0 -0
  301. codex-2.0.0a5/codex/static/assets/browser-BgbiiSE8.js +0 -1
  302. codex-2.0.0a5/codex/static/assets/browser-BgbiiSE8.js.br +0 -0
  303. codex-2.0.0a5/codex/static/assets/browser-BgbiiSE8.js.gz +0 -0
  304. codex-2.0.0a5/codex/static/assets/clipboard-BSl1Ykzq.js +0 -1
  305. codex-2.0.0a5/codex/static/assets/clipboard-BSl1Ykzq.js.br +0 -0
  306. codex-2.0.0a5/codex/static/assets/clipboard-BSl1Ykzq.js.gz +0 -0
  307. codex-2.0.0a5/codex/static/assets/close-button-Dc8eXUft.js +0 -1
  308. codex-2.0.0a5/codex/static/assets/close-button-Dc8eXUft.js.br +0 -0
  309. codex-2.0.0a5/codex/static/assets/close-button-Dc8eXUft.js.gz +0 -0
  310. codex-2.0.0a5/codex/static/assets/confirm-dialog-Bs2X_To-.js +0 -1
  311. codex-2.0.0a5/codex/static/assets/confirm-dialog-Bs2X_To-.js.br +0 -0
  312. codex-2.0.0a5/codex/static/assets/confirm-dialog-Bs2X_To-.js.gz +0 -0
  313. codex-2.0.0a5/codex/static/assets/custom-covers-tab-CZChURF5.js +0 -1
  314. codex-2.0.0a5/codex/static/assets/custom-covers-tab-CZChURF5.js.br +0 -0
  315. codex-2.0.0a5/codex/static/assets/custom-covers-tab-CZChURF5.js.gz +0 -0
  316. codex-2.0.0a5/codex/static/assets/custom-covers-tab-_wL0WYqc.css +0 -1
  317. codex-2.0.0a5/codex/static/assets/custom-covers-tab-_wL0WYqc.css.br +0 -0
  318. codex-2.0.0a5/codex/static/assets/custom-covers-tab-_wL0WYqc.css.gz +0 -0
  319. codex-2.0.0a5/codex/static/assets/datetime-column-CGqtuwKh.js +0 -1
  320. codex-2.0.0a5/codex/static/assets/datetime-column-CGqtuwKh.js.br +0 -0
  321. codex-2.0.0a5/codex/static/assets/datetime-column-CGqtuwKh.js.gz +0 -0
  322. codex-2.0.0a5/codex/static/assets/delete-row-dialog-DrUH7bIq.js +0 -1
  323. codex-2.0.0a5/codex/static/assets/delete-row-dialog-DrUH7bIq.js.br +0 -0
  324. codex-2.0.0a5/codex/static/assets/delete-row-dialog-DrUH7bIq.js.gz +0 -0
  325. codex-2.0.0a5/codex/static/assets/edit-panel-ekE_Rg_v.js +0 -1
  326. codex-2.0.0a5/codex/static/assets/edit-panel-ekE_Rg_v.js.br +0 -0
  327. codex-2.0.0a5/codex/static/assets/edit-panel-ekE_Rg_v.js.gz +0 -0
  328. codex-2.0.0a5/codex/static/assets/email-tab-9vY4EQIt.css +0 -1
  329. codex-2.0.0a5/codex/static/assets/email-tab-9vY4EQIt.css.br +0 -0
  330. codex-2.0.0a5/codex/static/assets/email-tab-9vY4EQIt.css.gz +0 -0
  331. codex-2.0.0a5/codex/static/assets/email-tab-Def3bJFk.js +0 -1
  332. codex-2.0.0a5/codex/static/assets/email-tab-Def3bJFk.js.br +0 -0
  333. codex-2.0.0a5/codex/static/assets/email-tab-Def3bJFk.js.gz +0 -0
  334. codex-2.0.0a5/codex/static/assets/expand-toggle-CFBcKp8z.js +0 -1
  335. codex-2.0.0a5/codex/static/assets/expand-toggle-CFBcKp8z.js.br +0 -0
  336. codex-2.0.0a5/codex/static/assets/expand-toggle-CFBcKp8z.js.gz +0 -0
  337. codex-2.0.0a5/codex/static/assets/expand-toggle-DSKe4ham.css +0 -1
  338. codex-2.0.0a5/codex/static/assets/expand-toggle-DSKe4ham.css.br +0 -0
  339. codex-2.0.0a5/codex/static/assets/expand-toggle-DSKe4ham.css.gz +0 -0
  340. codex-2.0.0a5/codex/static/assets/flag-card-C7BC1zDq.js +0 -1
  341. codex-2.0.0a5/codex/static/assets/flag-card-C7BC1zDq.js.br +0 -0
  342. codex-2.0.0a5/codex/static/assets/flag-card-C7BC1zDq.js.gz +0 -0
  343. codex-2.0.0a5/codex/static/assets/flag-card-Usnel6Y1.css +0 -1
  344. codex-2.0.0a5/codex/static/assets/flag-card-Usnel6Y1.css.br +0 -0
  345. codex-2.0.0a5/codex/static/assets/flag-card-Usnel6Y1.css.gz +0 -0
  346. codex-2.0.0a5/codex/static/assets/group-tab-DuIq7Kai.css +0 -1
  347. codex-2.0.0a5/codex/static/assets/group-tab-DuIq7Kai.css.br +0 -0
  348. codex-2.0.0a5/codex/static/assets/group-tab-DuIq7Kai.css.gz +0 -0
  349. codex-2.0.0a5/codex/static/assets/group-tab-HHinNhAQ.js +0 -1
  350. codex-2.0.0a5/codex/static/assets/group-tab-HHinNhAQ.js.br +0 -0
  351. codex-2.0.0a5/codex/static/assets/group-tab-HHinNhAQ.js.gz +0 -0
  352. codex-2.0.0a5/codex/static/assets/http-error-Cazws2U2.js +0 -1
  353. codex-2.0.0a5/codex/static/assets/http-error-Cazws2U2.js.br +0 -0
  354. codex-2.0.0a5/codex/static/assets/http-error-Cazws2U2.js.gz +0 -0
  355. codex-2.0.0a5/codex/static/assets/job-tab-BApBoJRK.js +0 -1
  356. codex-2.0.0a5/codex/static/assets/job-tab-BApBoJRK.js.br +0 -0
  357. codex-2.0.0a5/codex/static/assets/job-tab-BApBoJRK.js.gz +0 -0
  358. codex-2.0.0a5/codex/static/assets/job-tab-BvmDWqzr.css +0 -1
  359. codex-2.0.0a5/codex/static/assets/job-tab-BvmDWqzr.css.br +0 -0
  360. codex-2.0.0a5/codex/static/assets/job-tab-BvmDWqzr.css.gz +0 -0
  361. codex-2.0.0a5/codex/static/assets/library-tab-C9N6c98Y.js +0 -1
  362. codex-2.0.0a5/codex/static/assets/library-tab-C9N6c98Y.js.br +0 -0
  363. codex-2.0.0a5/codex/static/assets/library-tab-C9N6c98Y.js.gz +0 -0
  364. codex-2.0.0a5/codex/static/assets/library-tab-NdSulWoZ.css +0 -1
  365. codex-2.0.0a5/codex/static/assets/library-tab-NdSulWoZ.css.br +0 -0
  366. codex-2.0.0a5/codex/static/assets/library-tab-NdSulWoZ.css.gz +0 -0
  367. codex-2.0.0a5/codex/static/assets/main-BPtFHXfC.js +0 -6
  368. codex-2.0.0a5/codex/static/assets/main-BPtFHXfC.js.br +0 -0
  369. codex-2.0.0a5/codex/static/assets/main-BPtFHXfC.js.gz +0 -0
  370. codex-2.0.0a5/codex/static/assets/pagination-toolbar-CLuw3qbT.js +0 -2
  371. codex-2.0.0a5/codex/static/assets/pagination-toolbar-CLuw3qbT.js.br +0 -0
  372. codex-2.0.0a5/codex/static/assets/pagination-toolbar-CLuw3qbT.js.gz +0 -0
  373. codex-2.0.0a5/codex/static/assets/pdf-doc-BmR6vFG6.js +0 -378
  374. codex-2.0.0a5/codex/static/assets/pdf-doc-BmR6vFG6.js.br +0 -0
  375. codex-2.0.0a5/codex/static/assets/pdf-doc-BmR6vFG6.js.gz +0 -0
  376. codex-2.0.0a5/codex/static/assets/prompt-popup-CDFFpu9x.js +0 -2
  377. codex-2.0.0a5/codex/static/assets/prompt-popup-CDFFpu9x.js.br +0 -0
  378. codex-2.0.0a5/codex/static/assets/prompt-popup-CDFFpu9x.js.gz +0 -0
  379. codex-2.0.0a5/codex/static/assets/reader-BBxZVO_7.js +0 -2
  380. codex-2.0.0a5/codex/static/assets/reader-BBxZVO_7.js.br +0 -0
  381. codex-2.0.0a5/codex/static/assets/reader-BBxZVO_7.js.gz +0 -0
  382. codex-2.0.0a5/codex/static/assets/relation-chips-BTPuZhWt.js +0 -1
  383. codex-2.0.0a5/codex/static/assets/relation-chips-BTPuZhWt.js.br +0 -0
  384. codex-2.0.0a5/codex/static/assets/relation-chips-BTPuZhWt.js.gz +0 -0
  385. codex-2.0.0a5/codex/static/assets/reset-password-confirm-CABMHMIA.js +0 -1
  386. codex-2.0.0a5/codex/static/assets/reset-password-confirm-CABMHMIA.js.br +0 -0
  387. codex-2.0.0a5/codex/static/assets/reset-password-confirm-CABMHMIA.js.gz +0 -0
  388. codex-2.0.0a5/codex/static/assets/restore-tab-Dghtp30c.js +0 -3
  389. codex-2.0.0a5/codex/static/assets/restore-tab-Dghtp30c.js.br +0 -0
  390. codex-2.0.0a5/codex/static/assets/restore-tab-Dghtp30c.js.gz +0 -0
  391. codex-2.0.0a5/codex/static/assets/restore-tab-x0r0JIjS.css +0 -1
  392. codex-2.0.0a5/codex/static/assets/restore-tab-x0r0JIjS.css.br +0 -0
  393. codex-2.0.0a5/codex/static/assets/restore-tab-x0r0JIjS.css.gz +0 -0
  394. codex-2.0.0a5/codex/static/assets/settings-tab-C3v6mhJb.css +0 -1
  395. codex-2.0.0a5/codex/static/assets/settings-tab-C3v6mhJb.css.br +0 -0
  396. codex-2.0.0a5/codex/static/assets/settings-tab-C3v6mhJb.css.gz +0 -0
  397. codex-2.0.0a5/codex/static/assets/settings-tab-x_z1X-kK.js +0 -1
  398. codex-2.0.0a5/codex/static/assets/settings-tab-x_z1X-kK.js.br +0 -0
  399. codex-2.0.0a5/codex/static/assets/settings-tab-x_z1X-kK.js.gz +0 -0
  400. codex-2.0.0a5/codex/static/assets/stats-tab-BoLJfSqD.css +0 -1
  401. codex-2.0.0a5/codex/static/assets/stats-tab-BoLJfSqD.css.br +0 -0
  402. codex-2.0.0a5/codex/static/assets/stats-tab-BoLJfSqD.css.gz +0 -0
  403. codex-2.0.0a5/codex/static/assets/stats-tab-UflycG97.js +0 -1
  404. codex-2.0.0a5/codex/static/assets/stats-tab-UflycG97.js.br +0 -0
  405. codex-2.0.0a5/codex/static/assets/stats-tab-UflycG97.js.gz +0 -0
  406. codex-2.0.0a5/codex/static/assets/submit-footer-DriKf-cN.js +0 -1
  407. codex-2.0.0a5/codex/static/assets/submit-footer-DriKf-cN.js.br +0 -0
  408. codex-2.0.0a5/codex/static/assets/submit-footer-DriKf-cN.js.gz +0 -0
  409. codex-2.0.0a5/codex/static/assets/tagging-tab-B0C_v2DD.css +0 -1
  410. codex-2.0.0a5/codex/static/assets/tagging-tab-B0C_v2DD.css.br +0 -0
  411. codex-2.0.0a5/codex/static/assets/tagging-tab-B0C_v2DD.css.gz +0 -0
  412. codex-2.0.0a5/codex/static/assets/tagging-tab-l9YIlj2C.js +0 -1
  413. codex-2.0.0a5/codex/static/assets/tagging-tab-l9YIlj2C.js.br +0 -0
  414. codex-2.0.0a5/codex/static/assets/tagging-tab-l9YIlj2C.js.gz +0 -0
  415. codex-2.0.0a5/codex/static/assets/tooltip-BR_Oxgu4.js +0 -1
  416. codex-2.0.0a5/codex/static/assets/tooltip-BR_Oxgu4.js.br +0 -0
  417. codex-2.0.0a5/codex/static/assets/tooltip-BR_Oxgu4.js.gz +0 -0
  418. codex-2.0.0a5/codex/static/assets/unauthorized-Xa65QK0Z.js +0 -1
  419. codex-2.0.0a5/codex/static/assets/unauthorized-Xa65QK0Z.js.br +0 -0
  420. codex-2.0.0a5/codex/static/assets/unauthorized-Xa65QK0Z.js.gz +0 -0
  421. codex-2.0.0a5/codex/static/assets/use-now-timer-Dv_L4ft2.js +0 -1
  422. codex-2.0.0a5/codex/static/assets/use-now-timer-Dv_L4ft2.js.br +0 -0
  423. codex-2.0.0a5/codex/static/assets/use-now-timer-Dv_L4ft2.js.gz +0 -0
  424. codex-2.0.0a5/codex/static/assets/user-tab-BHrfMNm5.css +0 -1
  425. codex-2.0.0a5/codex/static/assets/user-tab-BHrfMNm5.css.br +0 -0
  426. codex-2.0.0a5/codex/static/assets/user-tab-BHrfMNm5.css.gz +0 -0
  427. codex-2.0.0a5/codex/static/assets/user-tab-DQpDeYpm.js +0 -1
  428. codex-2.0.0a5/codex/static/assets/user-tab-DQpDeYpm.js.br +0 -0
  429. codex-2.0.0a5/codex/static/assets/user-tab-DQpDeYpm.js.gz +0 -0
  430. codex-2.0.0a5/codex/static/manifest.json +0 -1102
  431. codex-2.0.0a5/codex/static/manifest.json.br +0 -0
  432. codex-2.0.0a5/codex/static/manifest.json.gz +0 -0
  433. codex-2.0.0a5/codex/views/admin/identifier_parse.py +0 -150
  434. codex-2.0.0a5/codex/views/admin/tasks.py +0 -205
  435. codex-2.0.0a5/codex/views/browser/metadata/const.py +0 -112
  436. codex-2.0.0a5/codex/views/browser/metadata/copy_intersections.py +0 -90
  437. codex-2.0.0a5/codex/views/browser/paginate.py +0 -111
  438. codex-2.0.0a5/frontend/.eslintcache +0 -1
  439. codex-2.0.0a5/frontend/bun.lock +0 -1145
  440. codex-2.0.0a5/frontend/package.json +0 -55
  441. codex-2.0.0a5/frontend/src/choices/admin-jobs.json +0 -417
  442. codex-2.0.0a5/frontend/src/choices/admin-status-titles.json +0 -62
  443. codex-2.0.0a5/frontend/src/components/admin/tabs/admin-section.scss +0 -231
  444. codex-2.0.0a5/package.json +0 -107
  445. codex-2.0.0a5/pyproject.toml +0 -419
  446. codex-2.0.0a5/tests/test_snapshot_diff.py +0 -222
  447. codex-2.0.0a5/tests/test_tag_writer_progress.py +0 -98
  448. codex-2.0.0a5/uv.lock +0 -4375
  449. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/.dockerignore +0 -0
  450. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/.github/workflows/ci.yml +0 -0
  451. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/.gitignore +0 -0
  452. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/.prettierignore +0 -0
  453. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/.readthedocs.yaml +0 -0
  454. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/.remarkignore +0 -0
  455. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/.shellcheckrc +0 -0
  456. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/Makefile +0 -0
  457. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/NEWS.md +0 -0
  458. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/README.md +0 -0
  459. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/benchmark-opds.sh +0 -0
  460. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/build-choices.sh +0 -0
  461. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/build-dist.sh +0 -0
  462. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/ci-download-dist-if-identical.sh +0 -0
  463. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/clean-pycache.sh +0 -0
  464. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/cleanup-pypi-alpha.sh +0 -0
  465. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/collectstatic.sh +0 -0
  466. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/delete-files.sh +0 -0
  467. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/dev-docker.sh +0 -0
  468. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/dev-module.sh +0 -0
  469. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/dev-prod-server.sh +0 -0
  470. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/dev-reverse-proxy.sh +0 -0
  471. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/dev.sh +0 -0
  472. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/docker-compose-exit.sh +0 -0
  473. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/docker-tag-latest.sh +0 -0
  474. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/fix-docker.sh +0 -0
  475. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/fix-python.sh +0 -0
  476. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/fix-sh.sh +0 -0
  477. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/fix.sh +0 -0
  478. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/ghcr-prune-alphas.sh +0 -0
  479. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/icons_transform.py +0 -0
  480. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/kill-codex.sh +0 -0
  481. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/kill-eslint_d.sh +0 -0
  482. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/lint-ci.sh +0 -0
  483. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/lint-complexity.sh +0 -0
  484. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/lint-darwin.sh +0 -0
  485. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/lint-docker.sh +0 -0
  486. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/lint-python.sh +0 -0
  487. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/lint-sh.sh +0 -0
  488. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/lint.sh +0 -0
  489. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/localize-db.sh +0 -0
  490. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/localize_library.sql +0 -0
  491. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/manage.py +0 -0
  492. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/pm +0 -0
  493. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/prettier-nginx.sh +0 -0
  494. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/remark-for-claude.sh +0 -0
  495. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/roman.py +0 -0
  496. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/sort-ignore.sh +0 -0
  497. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/sync_comic_logo.py +0 -0
  498. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/test-python.sh +0 -0
  499. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/type-python.sh +0 -0
  500. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/uml.sh +0 -0
  501. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/update-deps-node.sh +0 -0
  502. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/update-deps-python.sh +0 -0
  503. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/vendor-diff-package.sh +0 -0
  504. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/vendor-patch-imports.sh +0 -0
  505. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/version-node.sh +0 -0
  506. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/bin/version-python.sh +0 -0
  507. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/__init__.py +0 -0
  508. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/applications/__init__.py +0 -0
  509. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/applications/lifespan.py +0 -0
  510. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/applications/websocket.py +0 -0
  511. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/asgi.py +0 -0
  512. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/authentication.py +0 -0
  513. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/cache.py +0 -0
  514. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/__init__.py +0 -0
  515. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/admin.py +0 -0
  516. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/browser.py +0 -0
  517. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/choices_to_json.py +0 -0
  518. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/notifications.py +0 -0
  519. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/reader.py +0 -0
  520. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/search.py +0 -0
  521. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/statii.py +0 -0
  522. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/choices/tagging.py +0 -0
  523. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/collection.py +0 -0
  524. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/db_routers.py +0 -0
  525. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/failed_login_log.py +0 -0
  526. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/README.md +0 -0
  527. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/__init__.py +0 -0
  528. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/bookmark/__init__.py +0 -0
  529. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/bookmark/bookmarkd.py +0 -0
  530. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/bookmark/latest_version.py +0 -0
  531. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/bookmark/tasks.py +0 -0
  532. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/bookmark/update.py +0 -0
  533. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/bookmark/user_active.py +0 -0
  534. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/covers/__init__.py +0 -0
  535. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/covers/coverd.py +0 -0
  536. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/covers/create.py +0 -0
  537. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/covers/path.py +0 -0
  538. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/covers/purge.py +0 -0
  539. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/covers/status.py +0 -0
  540. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/covers/tasks.py +0 -0
  541. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/cron/__init__.py +0 -0
  542. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/cron/crond.py +0 -0
  543. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/README.md +0 -0
  544. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/__init__.py +0 -0
  545. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/events.py +0 -0
  546. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/filters.py +0 -0
  547. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/import_task.py +0 -0
  548. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/poller/__init__.py +0 -0
  549. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/poller/poller.py +0 -0
  550. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/poller/status.py +0 -0
  551. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/poller/tasks.py +0 -0
  552. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/status.py +0 -0
  553. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/tasks.py +0 -0
  554. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/__init__.py +0 -0
  555. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/data.py +0 -0
  556. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/dirs.py +0 -0
  557. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/events.py +0 -0
  558. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/move.py +0 -0
  559. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/status.py +0 -0
  560. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/tasks.py +0 -0
  561. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/fs/watcher/watcher.py +0 -0
  562. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/memory.py +0 -0
  563. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/mp_queue.py +0 -0
  564. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/notifier/__init__.py +0 -0
  565. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/notifier/notifierd.py +0 -0
  566. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/notifier/tasks.py +0 -0
  567. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/__init__.py +0 -0
  568. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/credential_validator.py +0 -0
  569. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/explicit_id.py +0 -0
  570. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/onlinetagd.py +0 -0
  571. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/outcome_stats.py +0 -0
  572. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/session_cache.py +0 -0
  573. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/session_manager.py +0 -0
  574. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/session_state.py +0 -0
  575. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/status.py +0 -0
  576. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/tag_pass_runner.py +0 -0
  577. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/onlinetag/tasks.py +0 -0
  578. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/restarter/__init__.py +0 -0
  579. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/restarter/restarter.py +0 -0
  580. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/restarter/status.py +0 -0
  581. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/restarter/tasks.py +0 -0
  582. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/__init__.py +0 -0
  583. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/force_updater.py +0 -0
  584. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/__init__.py +0 -0
  585. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/const.py +0 -0
  586. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/create/__init__.py +0 -0
  587. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/create/comics.py +0 -0
  588. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/create/const.py +0 -0
  589. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/create/covers.py +0 -0
  590. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/create/folders.py +0 -0
  591. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/create/foreign_keys.py +0 -0
  592. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/create/link_fks.py +0 -0
  593. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/delete/__init__.py +0 -0
  594. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/delete/comics.py +0 -0
  595. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/delete/covers.py +0 -0
  596. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/delete/folders.py +0 -0
  597. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/failed/__init__.py +0 -0
  598. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/failed/create.py +0 -0
  599. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/failed/failed.py +0 -0
  600. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/failed/query.py +0 -0
  601. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/finish.py +0 -0
  602. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/importer.py +0 -0
  603. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/init.py +0 -0
  604. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/link/__init__.py +0 -0
  605. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/link/const.py +0 -0
  606. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/link/covers.py +0 -0
  607. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/link/delete.py +0 -0
  608. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/link/many_to_many.py +0 -0
  609. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/link/prepare.py +0 -0
  610. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/link/sum.py +0 -0
  611. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/moved/__init__.py +0 -0
  612. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/moved/comics.py +0 -0
  613. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/moved/covers.py +0 -0
  614. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/moved/folders.py +0 -0
  615. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/pragmas.py +0 -0
  616. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/__init__.py +0 -0
  617. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/covers.py +0 -0
  618. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/filters.py +0 -0
  619. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/foreign_keys.py +0 -0
  620. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/links.py +0 -0
  621. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/links_fk.py +0 -0
  622. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/links_m2m.py +0 -0
  623. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/update_comics.py +0 -0
  624. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/query/update_fks.py +0 -0
  625. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/read/__init__.py +0 -0
  626. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/read/aggregate_path.py +0 -0
  627. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/read/const.py +0 -0
  628. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/read/extract.py +0 -0
  629. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/read/folders.py +0 -0
  630. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/read/foreign_keys.py +0 -0
  631. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/read/many_to_many.py +0 -0
  632. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/search/__init__.py +0 -0
  633. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/search/prepare.py +0 -0
  634. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/search/sync_m2m.py +0 -0
  635. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/search/update.py +0 -0
  636. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/__init__.py +0 -0
  637. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/create.py +0 -0
  638. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/delete.py +0 -0
  639. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/failed.py +0 -0
  640. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/link.py +0 -0
  641. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/moved.py +0 -0
  642. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/query.py +0 -0
  643. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/read.py +0 -0
  644. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/statii/search.py +0 -0
  645. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/status.py +0 -0
  646. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/importer/tasks.py +0 -0
  647. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/janitor/__init__.py +0 -0
  648. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/janitor/adopt_folders.py +0 -0
  649. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/janitor/cleanup.py +0 -0
  650. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/janitor/failed_imports.py +0 -0
  651. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/janitor/scheduled_time.py +0 -0
  652. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/janitor/update.py +0 -0
  653. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/janitor/vacuum.py +0 -0
  654. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/lazy_importer.py +0 -0
  655. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/priority.py +0 -0
  656. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/scribed.py +0 -0
  657. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/__init__.py +0 -0
  658. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/const.py +0 -0
  659. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/handler.py +0 -0
  660. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/optimize.py +0 -0
  661. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/prepare.py +0 -0
  662. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/remove.py +0 -0
  663. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/status.py +0 -0
  664. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/sync.py +0 -0
  665. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/search/tasks.py +0 -0
  666. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/status.py +0 -0
  667. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/tag_writer.py +0 -0
  668. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/tagwrite_errors.py +0 -0
  669. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/tasks.py +0 -0
  670. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/scribe/timestamp_update.py +0 -0
  671. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/status.py +0 -0
  672. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/status_controller.py +0 -0
  673. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/tasks.py +0 -0
  674. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/telemeter/__init__.py +0 -0
  675. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/telemeter/scheduled_time.py +0 -0
  676. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/telemeter/stats.py +0 -0
  677. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/telemeter/tasks.py +0 -0
  678. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/telemeter/telemeter.py +0 -0
  679. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/threads.py +0 -0
  680. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/librarian/worker.py +0 -0
  681. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/mail.py +0 -0
  682. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/management/__init__.py +0 -0
  683. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/management/commands/__init__.py +0 -0
  684. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/management/commands/restore_user_data.py +0 -0
  685. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/middleware.py +0 -0
  686. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0001_init.py +0 -0
  687. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0002_auto_20200826_0622.py +0 -0
  688. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0003_auto_20200831_2033.py +0 -0
  689. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0004_failedimport.py +0 -0
  690. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0005_auto_20200918_0146.py +0 -0
  691. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0006_update_default_names_and_remove_duplicate_comics.py +0 -0
  692. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0007_auto_20211210_1710.py +0 -0
  693. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0008_alter_comic_created_at_alter_comic_format_and_more.py +0 -0
  694. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0009_alter_comic_parent_folder.py +0 -0
  695. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0010_haystack.py +0 -0
  696. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0011_library_groups_and_metadata_changes.py +0 -0
  697. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0012_rename_description_comic_comments.py +0 -0
  698. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0013_int_issue_count_longer_charfields.py +0 -0
  699. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0014_pdf_issue_suffix_remove_cover_image_sort_name.py +0 -0
  700. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0015_link_comics_to_top_level_folders.py +0 -0
  701. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0016_remove_comic_cover_path_librarianstatus.py +0 -0
  702. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0017_alter_timestamp_options_alter_adminflag_name_and_more.py +0 -0
  703. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0018_rename_userbookmark_bookmark.py +0 -0
  704. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0019_delete_queuejob.py +0 -0
  705. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0020_remove_search_tables.py +0 -0
  706. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0021_bookmark_fit_to_choices_read_in_reverse.py +0 -0
  707. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0022_bookmark_vertical_useractive_null_statuses.py +0 -0
  708. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0023_rename_credit_creator_and_more.py +0 -0
  709. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0024_comic_gtin_comic_story_arc_number.py +0 -0
  710. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0025_add_story_arc_number.py +0 -0
  711. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0026_comicbox_1.py +0 -0
  712. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0027_import_order_and_covers.py +0 -0
  713. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0028_telemeter.py +0 -0
  714. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0029_comicfts.py +0 -0
  715. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0030_nocase_collation_day_month_indexes_status_types.py +0 -0
  716. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0031_adminflag_banner.py +0 -0
  717. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0032_alter_librarianstatus_preactive.py +0 -0
  718. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0033_alter_librarianstatus_status_type.py +0 -0
  719. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0034_comicbox2.py +0 -0
  720. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0035_fts_optmize.py +0 -0
  721. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0036_alter_comic_path_alter_customcover_path_and_more.py +0 -0
  722. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0037_redefine_reading_direction_filetype_choices.py +0 -0
  723. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0038_settings_tables.py +0 -0
  724. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0039_metron_age_rating_default_view_and_performance.py +0 -0
  725. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0040_reset_global_cache_book.py +0 -0
  726. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0041_cleanup_phantom_comic_as_folder_rows.py +0 -0
  727. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/0042_browser_table_view_and_favorites.py +0 -0
  728. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/migrations/__init__.py +0 -0
  729. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/__init__.py +0 -0
  730. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/admin.py +0 -0
  731. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/age_rating.py +0 -0
  732. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/auth.py +0 -0
  733. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/base.py +0 -0
  734. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/bookmark.py +0 -0
  735. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/choices.py +0 -0
  736. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/collections.py +0 -0
  737. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/comic.py +0 -0
  738. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/favorite.py +0 -0
  739. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/fields.py +0 -0
  740. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/functions.py +0 -0
  741. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/identifier.py +0 -0
  742. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/library.py +0 -0
  743. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/named.py +0 -0
  744. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/paths.py +0 -0
  745. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/query.py +0 -0
  746. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/settings.py +0 -0
  747. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/models/util.py +0 -0
  748. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/run.py +0 -0
  749. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/README.md +0 -0
  750. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/__init__.py +0 -0
  751. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/__init__.py +0 -0
  752. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/custom_cover.py +0 -0
  753. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/email.py +0 -0
  754. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/flags.py +0 -0
  755. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/groups.py +0 -0
  756. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/libraries.py +0 -0
  757. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/stats.py +0 -0
  758. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/tagging.py +0 -0
  759. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/tasks.py +0 -0
  760. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/throttle.py +0 -0
  761. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/admin/users.py +0 -0
  762. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/auth.py +0 -0
  763. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/__init__.py +0 -0
  764. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/choices.py +0 -0
  765. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/filters.py +0 -0
  766. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/metadata.py +0 -0
  767. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/mixins.py +0 -0
  768. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/mtime.py +0 -0
  769. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/page.py +0 -0
  770. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/saved.py +0 -0
  771. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/browser/settings.py +0 -0
  772. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/__init__.py +0 -0
  773. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/auth.py +0 -0
  774. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/base.py +0 -0
  775. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/browser.py +0 -0
  776. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/collection.py +0 -0
  777. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/reader.py +0 -0
  778. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/sanitized.py +0 -0
  779. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/settings.py +0 -0
  780. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/stats.py +0 -0
  781. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/fields/vuetify.py +0 -0
  782. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/homepage.py +0 -0
  783. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/mixins.py +0 -0
  784. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/__init__.py +0 -0
  785. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/admin.py +0 -0
  786. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/base.py +0 -0
  787. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/bookmark.py +0 -0
  788. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/collections.py +0 -0
  789. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/comic.py +0 -0
  790. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/named.py +0 -0
  791. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/models/pycountry.py +0 -0
  792. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/__init__.py +0 -0
  793. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/authentication.py +0 -0
  794. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/urls.py +0 -0
  795. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v1.py +0 -0
  796. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/__init__.py +0 -0
  797. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/facet.py +0 -0
  798. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/feed.py +0 -0
  799. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/links.py +0 -0
  800. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/metadata.py +0 -0
  801. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/progression.py +0 -0
  802. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/publication.py +0 -0
  803. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/opds/v2/unused.py +0 -0
  804. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/reader.py +0 -0
  805. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/redirect.py +0 -0
  806. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/route.py +0 -0
  807. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/settings.py +0 -0
  808. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/serializers/versions.py +0 -0
  809. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/README.md +0 -0
  810. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/__init__.py +0 -0
  811. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/codex.toml.default +0 -0
  812. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/config.py +0 -0
  813. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/db.py +0 -0
  814. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/hypercorn_migrate.py +0 -0
  815. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/logging.py +0 -0
  816. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/secret_key.py +0 -0
  817. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/servestatic.py +0 -0
  818. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/settings/timezone.py +0 -0
  819. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/signals/__init__.py +0 -0
  820. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/signals/django_signals.py +0 -0
  821. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/signals/os_signals.py +0 -0
  822. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/startup/__init__.py +0 -0
  823. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/startup/db.py +0 -0
  824. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/startup/loguru.py +0 -0
  825. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/startup/registration.py +0 -0
  826. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCard-BCYbpv-w.css +0 -0
  827. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCard-BCYbpv-w.css.br +0 -0
  828. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCard-BCYbpv-w.css.gz +0 -0
  829. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCheckbox-ChRKi1kj.css +0 -0
  830. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCheckbox-ChRKi1kj.css.br +0 -0
  831. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCheckbox-ChRKi1kj.css.gz +0 -0
  832. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VChip-DYEA3aEu.css +0 -0
  833. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VChip-DYEA3aEu.css.br +0 -0
  834. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VChip-DYEA3aEu.css.gz +0 -0
  835. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCombobox-C3ha-zP2.css +0 -0
  836. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCombobox-C3ha-zP2.css.br +0 -0
  837. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VCombobox-C3ha-zP2.css.gz +0 -0
  838. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VExpansionPanels-cvCWEkWz.css +0 -0
  839. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VExpansionPanels-cvCWEkWz.css.br +0 -0
  840. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VExpansionPanels-cvCWEkWz.css.gz +0 -0
  841. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VProgressCircular-BT8mV8ah.js +0 -0
  842. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VProgressCircular-BT8mV8ah.js.br +0 -0
  843. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VProgressCircular-BT8mV8ah.js.gz +0 -0
  844. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VProgressCircular-Du8ZZdoy.css +0 -0
  845. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VProgressCircular-Du8ZZdoy.css.br +0 -0
  846. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VProgressCircular-Du8ZZdoy.css.gz +0 -0
  847. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VRadioGroup-C9f4tbih.css +0 -0
  848. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VRadioGroup-C9f4tbih.css.br +0 -0
  849. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VRadioGroup-C9f4tbih.css.gz +0 -0
  850. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VSelect-CHRolWTP.css +0 -0
  851. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VSelect-CHRolWTP.css.br +0 -0
  852. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VSelect-CHRolWTP.css.gz +0 -0
  853. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VSelectionControl-D9YoCXbC.css +0 -0
  854. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VSelectionControl-D9YoCXbC.css.br +0 -0
  855. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VSelectionControl-D9YoCXbC.css.gz +0 -0
  856. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTable-B6uyTt-U.js +0 -0
  857. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTable-B6uyTt-U.js.br +0 -0
  858. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTable-B6uyTt-U.js.gz +0 -0
  859. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTable-LbK8_KkU.css +0 -0
  860. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTable-LbK8_KkU.css.br +0 -0
  861. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTable-LbK8_KkU.css.gz +0 -0
  862. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTextField-CrvY9Oj5.css +0 -0
  863. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTextField-CrvY9Oj5.css.br +0 -0
  864. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/VTextField-CrvY9Oj5.css.gz +0 -0
  865. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-B664n-z3.css +0 -0
  866. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-B664n-z3.css.br +0 -0
  867. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-B664n-z3.css.gz +0 -0
  868. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-menu-Vhl4ElZB.css +0 -0
  869. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-menu-Vhl4ElZB.css.br +0 -0
  870. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-menu-Vhl4ElZB.css.gz +0 -0
  871. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-settings-button-errors-8nyZgICC.css +0 -0
  872. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-settings-button-errors-8nyZgICC.css.br +0 -0
  873. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-settings-button-errors-8nyZgICC.css.gz +0 -0
  874. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-settings-button-progress-DJAsUqRu.css +0 -0
  875. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-settings-button-prompts-DqHaoDam.css +0 -0
  876. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-settings-button-prompts-DqHaoDam.css.br +0 -0
  877. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/admin-settings-button-prompts-DqHaoDam.css.gz +0 -0
  878. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/base-CtB9eVX-.js +0 -0
  879. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/base-CtB9eVX-.js.br +0 -0
  880. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/base-CtB9eVX-.js.gz +0 -0
  881. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/browser-wOyS0g8D.css +0 -0
  882. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/browser-wOyS0g8D.css.br +0 -0
  883. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/browser-wOyS0g8D.css.gz +0 -0
  884. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/clipboard-CHKZWj7s.css +0 -0
  885. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/clipboard-CHKZWj7s.css.br +0 -0
  886. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/clipboard-CHKZWj7s.css.gz +0 -0
  887. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/close-button-CEYanHQ4.css +0 -0
  888. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/confirm-dialog-D5_8m9zi.css +0 -0
  889. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/confirm-dialog-D5_8m9zi.css.br +0 -0
  890. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/confirm-dialog-D5_8m9zi.css.gz +0 -0
  891. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/datetime-column-BH-nhgFS.css +0 -0
  892. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/delete-row-dialog-CH0WB-vX.css +0 -0
  893. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/delete-row-dialog-CH0WB-vX.css.br +0 -0
  894. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/delete-row-dialog-CH0WB-vX.css.gz +0 -0
  895. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/edit-panel-Xd0Gcm9X.css +0 -0
  896. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/edit-panel-Xd0Gcm9X.css.br +0 -0
  897. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/edit-panel-Xd0Gcm9X.css.gz +0 -0
  898. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/forwardRefs-CvzvePTj.css +0 -0
  899. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/forwardRefs-CvzvePTj.css.br +0 -0
  900. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/forwardRefs-CvzvePTj.css.gz +0 -0
  901. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/forwardRefs-U3sKIrMR.js +0 -0
  902. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/forwardRefs-U3sKIrMR.js.br +0 -0
  903. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/forwardRefs-U3sKIrMR.js.gz +0 -0
  904. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/http-error-1LOpL9mn.css +0 -0
  905. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/http-error-1LOpL9mn.css.br +0 -0
  906. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/http-error-1LOpL9mn.css.gz +0 -0
  907. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/main-DA6DuzZj.css +0 -0
  908. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/main-DA6DuzZj.css.br +0 -0
  909. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/main-DA6DuzZj.css.gz +0 -0
  910. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  911. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-B7mPwVP_.ttf.br +0 -0
  912. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-B7mPwVP_.ttf.gz +0 -0
  913. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  914. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-CSr8KVlo.eot.br +0 -0
  915. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-CSr8KVlo.eot.gz +0 -0
  916. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  917. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  918. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/online-tag-DvCx5Pxx.js +0 -0
  919. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/online-tag-DvCx5Pxx.js.br +0 -0
  920. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/online-tag-DvCx5Pxx.js.gz +0 -0
  921. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/pagination-toolbar-C04BwbEm.css +0 -0
  922. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/pagination-toolbar-C04BwbEm.css.br +0 -0
  923. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/pagination-toolbar-C04BwbEm.css.gz +0 -0
  924. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/pdf-doc-RMRstq1W.css +0 -0
  925. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/pdf-doc-RMRstq1W.css.br +0 -0
  926. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/pdf-doc-RMRstq1W.css.gz +0 -0
  927. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/prompt-popup-BIBfCIxp.css +0 -0
  928. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/prompt-popup-BIBfCIxp.css.br +0 -0
  929. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/prompt-popup-BIBfCIxp.css.gz +0 -0
  930. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/reader-CdzLPVKx.css +0 -0
  931. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/reader-CdzLPVKx.css.br +0 -0
  932. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/reader-CdzLPVKx.css.gz +0 -0
  933. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/relation-chips-CVzPLks2.css +0 -0
  934. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/relation-chips-CVzPLks2.css.br +0 -0
  935. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/relation-chips-CVzPLks2.css.gz +0 -0
  936. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/reset-password-confirm-ByPxowqs.css +0 -0
  937. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/reset-password-confirm-ByPxowqs.css.br +0 -0
  938. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/reset-password-confirm-ByPxowqs.css.gz +0 -0
  939. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/rolldown-runtime-DK3Fl9T5.js +0 -0
  940. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/rolldown-runtime-DK3Fl9T5.js.br +0 -0
  941. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/ssrBoot-r_MQBFjc.js +0 -0
  942. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/ssrBoot-r_MQBFjc.js.br +0 -0
  943. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/ssrBoot-r_MQBFjc.js.gz +0 -0
  944. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/submit-footer-DxBt30-N.css +0 -0
  945. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/submit-footer-DxBt30-N.css.br +0 -0
  946. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/submit-footer-DxBt30-N.css.gz +0 -0
  947. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/tagging-choices-BH2u4elJ.js +0 -0
  948. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/tagging-choices-BH2u4elJ.js.br +0 -0
  949. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/tagging-choices-BH2u4elJ.js.gz +0 -0
  950. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/tooltip-BI1qRHEp.css +0 -0
  951. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/tooltip-BI1qRHEp.css.br +0 -0
  952. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/tooltip-BI1qRHEp.css.gz +0 -0
  953. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/unauthorized-DoPdHZ05.css +0 -0
  954. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/unauthorized-DoPdHZ05.css.br +0 -0
  955. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/unauthorized-DoPdHZ05.css.gz +0 -0
  956. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/vendor-vue-CMvFUqt2.js +0 -0
  957. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/vendor-vue-CMvFUqt2.js.br +0 -0
  958. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/assets/vendor-vue-CMvFUqt2.js.gz +0 -0
  959. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/comic-165.webp +0 -0
  960. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/comic.svg +0 -0
  961. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/comic.svg.br +0 -0
  962. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/comic.svg.gz +0 -0
  963. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/folder.svg +0 -0
  964. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/folder.svg.br +0 -0
  965. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/folder.svg.gz +0 -0
  966. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/imprint.svg +0 -0
  967. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/imprint.svg.br +0 -0
  968. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/imprint.svg.gz +0 -0
  969. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo-32.webp +0 -0
  970. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo-maskable-180.webp +0 -0
  971. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo-maskable.svg +0 -0
  972. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo-maskable.svg.br +0 -0
  973. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo-maskable.svg.gz +0 -0
  974. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo.svg +0 -0
  975. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo.svg.br +0 -0
  976. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/logo.svg.gz +0 -0
  977. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/publisher.svg +0 -0
  978. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/publisher.svg.br +0 -0
  979. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/publisher.svg.gz +0 -0
  980. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/series.svg +0 -0
  981. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/series.svg.br +0 -0
  982. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/series.svg.gz +0 -0
  983. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/story-arc.svg +0 -0
  984. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/story-arc.svg.br +0 -0
  985. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/story-arc.svg.gz +0 -0
  986. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/volume.svg +0 -0
  987. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/volume.svg.br +0 -0
  988. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/img/volume.svg.gz +0 -0
  989. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/pwa/offline.html +0 -0
  990. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/pwa/offline.html.br +0 -0
  991. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/pwa/offline.html.gz +0 -0
  992. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static/robots.txt +0 -0
  993. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/.picopt_treestamps.yaml +0 -0
  994. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/comic-165.webp +0 -0
  995. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/comic.svg +0 -0
  996. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/folder.svg +0 -0
  997. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/imprint.svg +0 -0
  998. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/logo-32.webp +0 -0
  999. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/logo-maskable-180.webp +0 -0
  1000. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/logo-maskable.svg +0 -0
  1001. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/logo.svg +0 -0
  1002. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/publisher.svg +0 -0
  1003. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/series.svg +0 -0
  1004. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/story-arc.svg +0 -0
  1005. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/img/volume.svg +0 -0
  1006. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/pwa/offline.html +0 -0
  1007. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/static_src/robots.txt +0 -0
  1008. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/README.md +0 -0
  1009. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/headers-icons.html +0 -0
  1010. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/headers-script-globals.html +0 -0
  1011. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/index.html +0 -0
  1012. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/opds_v1/index.xml +0 -0
  1013. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/opds_v1/opensearch_v1.xml +0 -0
  1014. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/pwa/headers.html +0 -0
  1015. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/pwa/manifest.webmanifest +0 -0
  1016. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/pwa/serviceworker-register.js +0 -0
  1017. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/pwa/serviceworker.js +0 -0
  1018. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/rest_registration/register/body.txt +0 -0
  1019. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/rest_registration/register/subject.txt +0 -0
  1020. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/rest_registration/reset_password/body.html +0 -0
  1021. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/rest_registration/reset_password/body.txt +0 -0
  1022. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/templates/rest_registration/reset_password/subject.txt +0 -0
  1023. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/throttling.py +0 -0
  1024. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/__init__.py +0 -0
  1025. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/__init__.py +0 -0
  1026. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/root.py +0 -0
  1027. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/v4/__init__.py +0 -0
  1028. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/v4/admin.py +0 -0
  1029. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/v4/auth.py +0 -0
  1030. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/v4/browse.py +0 -0
  1031. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/v4/comics.py +0 -0
  1032. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/v4/favorites.py +0 -0
  1033. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/api/v4/reader.py +0 -0
  1034. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/app.py +0 -0
  1035. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/const.py +0 -0
  1036. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/converters.py +0 -0
  1037. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/opds/__init__.py +0 -0
  1038. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/opds/authentication.py +0 -0
  1039. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/opds/binary.py +0 -0
  1040. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/opds/root.py +0 -0
  1041. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/opds/v1.py +0 -0
  1042. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/opds/v2.py +0 -0
  1043. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/pwa.py +0 -0
  1044. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/root.py +0 -0
  1045. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/urls/spectacular.py +0 -0
  1046. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/__init__.py +0 -0
  1047. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/backups.py +0 -0
  1048. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/dump.py +0 -0
  1049. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/identifiers.py +0 -0
  1050. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/restore.py +0 -0
  1051. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/schema.sql +0 -0
  1052. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/serializers.py +0 -0
  1053. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/user_data/store.py +0 -0
  1054. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/util.py +0 -0
  1055. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/version.py +0 -0
  1056. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/README.md +0 -0
  1057. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/__init__.py +0 -0
  1058. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/__init__.py +0 -0
  1059. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/age_rating_metron.py +0 -0
  1060. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/api_key.py +0 -0
  1061. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/auth.py +0 -0
  1062. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/custom_cover.py +0 -0
  1063. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/dump_user_data.py +0 -0
  1064. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/email.py +0 -0
  1065. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/failed_imports_seen.py +0 -0
  1066. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/flag.py +0 -0
  1067. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/group.py +0 -0
  1068. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/json_api.py +0 -0
  1069. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/library.py +0 -0
  1070. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/onlinetag.py +0 -0
  1071. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/permissions.py +0 -0
  1072. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/restore_user_data.py +0 -0
  1073. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/stats.py +0 -0
  1074. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/tag_write_errors.py +0 -0
  1075. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/tagging_defaults.py +0 -0
  1076. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/tagging_validate.py +0 -0
  1077. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/tagwrite.py +0 -0
  1078. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/throttle.py +0 -0
  1079. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/admin/user.py +0 -0
  1080. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/auth.py +0 -0
  1081. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/bookmark.py +0 -0
  1082. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/__init__.py +0 -0
  1083. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/annotate/__init__.py +0 -0
  1084. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/annotate/bookmark.py +0 -0
  1085. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/annotate/card.py +0 -0
  1086. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/annotate/cover.py +0 -0
  1087. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/annotate/order.py +0 -0
  1088. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/bookmark.py +0 -0
  1089. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/breadcrumbs.py +0 -0
  1090. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/browser.py +0 -0
  1091. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/choices.py +0 -0
  1092. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/collection_mtime.py +0 -0
  1093. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/columns.py +0 -0
  1094. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/const.py +0 -0
  1095. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/cover.py +0 -0
  1096. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/download.py +0 -0
  1097. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/__init__.py +0 -0
  1098. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/bookmark.py +0 -0
  1099. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/collection.py +0 -0
  1100. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/field.py +0 -0
  1101. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/filter.py +0 -0
  1102. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/__init__.py +0 -0
  1103. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/field/__init__.py +0 -0
  1104. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/field/column.py +0 -0
  1105. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/field/expression.py +0 -0
  1106. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/field/filter.py +0 -0
  1107. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/field/parse.py +0 -0
  1108. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/fts.py +0 -0
  1109. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/filters/search/parse.py +0 -0
  1110. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/force_update.py +0 -0
  1111. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/intersections.py +0 -0
  1112. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/metadata/__init__.py +0 -0
  1113. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/metadata/annotate.py +0 -0
  1114. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/metadata/collection_list.py +0 -0
  1115. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/metadata/query_intersections.py +0 -0
  1116. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/mtime.py +0 -0
  1117. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/order_by.py +0 -0
  1118. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/page_in_bounds.py +0 -0
  1119. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/params.py +0 -0
  1120. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/saved_settings.py +0 -0
  1121. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/settings.py +0 -0
  1122. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/title.py +0 -0
  1123. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/browser/validate.py +0 -0
  1124. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/const.py +0 -0
  1125. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/download.py +0 -0
  1126. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/envelope.py +0 -0
  1127. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/error.py +0 -0
  1128. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/exceptions.py +0 -0
  1129. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/favorites.py +0 -0
  1130. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/frontend.py +0 -0
  1131. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/healthcheck.py +0 -0
  1132. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/lazy_import.py +0 -0
  1133. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/mixins.py +0 -0
  1134. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/__init__.py +0 -0
  1135. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/auth.py +0 -0
  1136. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/authentication/__init__.py +0 -0
  1137. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/authentication/v1.py +0 -0
  1138. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/binary.py +0 -0
  1139. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/const.py +0 -0
  1140. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/error.py +0 -0
  1141. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/feed.py +0 -0
  1142. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/metadata.py +0 -0
  1143. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/opensearch/__init__.py +0 -0
  1144. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/opensearch/v1.py +0 -0
  1145. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/route.py +0 -0
  1146. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/settings.py +0 -0
  1147. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/start.py +0 -0
  1148. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/urls.py +0 -0
  1149. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/user_agent.py +0 -0
  1150. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/__init__.py +0 -0
  1151. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/const.py +0 -0
  1152. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/entry/__init__.py +0 -0
  1153. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/entry/entry.py +0 -0
  1154. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/entry/links.py +0 -0
  1155. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/facets.py +0 -0
  1156. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/feed.py +0 -0
  1157. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v1/links.py +0 -0
  1158. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/__init__.py +0 -0
  1159. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/const.py +0 -0
  1160. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/feed/__init__.py +0 -0
  1161. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/feed/feed_links.py +0 -0
  1162. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/feed/groups.py +0 -0
  1163. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/feed/links.py +0 -0
  1164. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/feed/publications.py +0 -0
  1165. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/href.py +0 -0
  1166. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/manifest.py +0 -0
  1167. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/progression.py +0 -0
  1168. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/opds/v2/renderers.py +0 -0
  1169. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/pagination.py +0 -0
  1170. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/pwa.py +0 -0
  1171. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/__init__.py +0 -0
  1172. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/_archive_cache.py +0 -0
  1173. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/arcs.py +0 -0
  1174. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/books.py +0 -0
  1175. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/page.py +0 -0
  1176. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/params.py +0 -0
  1177. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/reader.py +0 -0
  1178. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reader/settings.py +0 -0
  1179. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/register.py +0 -0
  1180. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/reset_password.py +0 -0
  1181. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/session.py +0 -0
  1182. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/settings.py +0 -0
  1183. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/template.py +0 -0
  1184. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/util.py +0 -0
  1185. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/views/version.py +0 -0
  1186. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/websockets/README.md +0 -0
  1187. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/websockets/__init__.py +0 -0
  1188. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/websockets/consumers.py +0 -0
  1189. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/websockets/listener.py +0 -0
  1190. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/websockets/mp_queue.py +0 -0
  1191. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/websockets/payloads.py +0 -0
  1192. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/codex/xz.py +0 -0
  1193. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/compose.yaml +0 -0
  1194. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/DOCKER.md +0 -0
  1195. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/NEWS.md +0 -0
  1196. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/README.md +0 -0
  1197. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/WINDOWS.md +0 -0
  1198. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/codex/img/logo.svg +0 -0
  1199. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/requirements.txt +0 -0
  1200. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/strange.jpg +0 -0
  1201. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/style.css +0 -0
  1202. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/style.material.css +0 -0
  1203. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/style.mkdocs.css +0 -0
  1204. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/docs/style.readthedocs.css +0 -0
  1205. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/eslint.config.js +0 -0
  1206. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/.gitignore +0 -0
  1207. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/.npmrc +0 -0
  1208. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/.prettierignore +0 -0
  1209. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/.remarkignore +0 -0
  1210. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/.shellcheckrc +0 -0
  1211. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/DESIGN.md +0 -0
  1212. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/Makefile +0 -0
  1213. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/README.md +0 -0
  1214. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/dev-server.sh +0 -0
  1215. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/fix-sh.sh +0 -0
  1216. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/fix.sh +0 -0
  1217. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/kill-eslint_d.sh +0 -0
  1218. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/lint-darwin.sh +0 -0
  1219. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/lint-sh.sh +0 -0
  1220. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/lint.sh +0 -0
  1221. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/remark-for-claude.sh +0 -0
  1222. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/roman.py +0 -0
  1223. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/sort-ignore.sh +0 -0
  1224. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/update-deps-node.sh +0 -0
  1225. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/bin/version-node.sh +0 -0
  1226. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/cfg/codex-frontend.mk +0 -0
  1227. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/cfg/common.mk +0 -0
  1228. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/cfg/help.mk +0 -0
  1229. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/cfg/node.mk +0 -0
  1230. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/jsconfig.json +0 -0
  1231. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/admin.vue +0 -0
  1232. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/abortable.js +0 -0
  1233. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/admin.js +0 -0
  1234. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/auth.js +0 -0
  1235. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/base.js +0 -0
  1236. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/browser.js +0 -0
  1237. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/common.js +0 -0
  1238. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/favorites.js +0 -0
  1239. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/notify.js +0 -0
  1240. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/api/v4/reader.js +0 -0
  1241. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/app.vue +0 -0
  1242. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/browser.vue +0 -0
  1243. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/admin-flag-choices.json +0 -0
  1244. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/browser-choices.json +0 -0
  1245. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/browser-defaults.json +0 -0
  1246. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/browser-map.json +0 -0
  1247. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/browser-table-column-costs.json +0 -0
  1248. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/browser-table-columns.json +0 -0
  1249. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/browser-table-default-columns.json +0 -0
  1250. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/format-field-support.json +0 -0
  1251. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/format-field-values.json +0 -0
  1252. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/identifier-sources.json +0 -0
  1253. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/identifier-types.json +0 -0
  1254. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/languages.json +0 -0
  1255. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/reader-choices.json +0 -0
  1256. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/reader-defaults.json +0 -0
  1257. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/reader-map.json +0 -0
  1258. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/search-map.json +0 -0
  1259. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/tagging-choices.json +0 -0
  1260. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/choices/websocket-messages.json +0 -0
  1261. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/comic-name.js +0 -0
  1262. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/admin-header.vue +0 -0
  1263. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/browser-link.vue +0 -0
  1264. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/create-update-button.vue +0 -0
  1265. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/create-update-dialog.vue +0 -0
  1266. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/create-update-inputs-mixin.js +0 -0
  1267. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/duration-input.vue +0 -0
  1268. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/group-create-update-inputs.vue +0 -0
  1269. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/library-create-update-inputs.vue +0 -0
  1270. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/relation-picker.vue +0 -0
  1271. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/server-folder-picker.vue +0 -0
  1272. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/create-update-dialog/user-create-update-inputs.vue +0 -0
  1273. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/admin-menu.vue +0 -0
  1274. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/admin-settings-button-errors.vue +0 -0
  1275. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/admin-settings-button-progress.vue +0 -0
  1276. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/admin-settings-button-prompts.vue +0 -0
  1277. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/admin-settings-drawer.vue +0 -0
  1278. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/admin-settings-panel.vue +0 -0
  1279. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/status-list-item.vue +0 -0
  1280. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/drawer/status-list.vue +0 -0
  1281. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/group-chip.vue +0 -0
  1282. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/status-helpers.js +0 -0
  1283. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/action-bar.vue +0 -0
  1284. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/admin-section.vue +0 -0
  1285. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/admin-table.vue +0 -0
  1286. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/custom-covers-tab.vue +0 -0
  1287. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/datetime-column.vue +0 -0
  1288. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/delete-row-dialog.vue +0 -0
  1289. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/design.scss +0 -0
  1290. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/email-tab.vue +0 -0
  1291. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/expand-toggle.vue +0 -0
  1292. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/failed-imports-panel.vue +0 -0
  1293. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/flag-card.vue +0 -0
  1294. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/flag-descriptions.json +0 -0
  1295. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/flag-groups.json +0 -0
  1296. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/group-tab.vue +0 -0
  1297. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/job-tab.vue +0 -0
  1298. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/key-value-table.vue +0 -0
  1299. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/library-tab.vue +0 -0
  1300. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/library-table.vue +0 -0
  1301. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/relation-chips.vue +0 -0
  1302. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/replace-cover-button.vue +0 -0
  1303. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/restore-tab.vue +0 -0
  1304. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/settings-tab.vue +0 -0
  1305. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/stats-tab.vue +0 -0
  1306. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/tabs.vue +0 -0
  1307. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/tag-write-errors-panel.vue +0 -0
  1308. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/tagging-tab.vue +0 -0
  1309. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/tagging-validation-chip.vue +0 -0
  1310. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/throttling-section.vue +0 -0
  1311. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/tabs/user-tab.vue +0 -0
  1312. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/admin/use-now-timer.js +0 -0
  1313. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/anchors.scss +0 -0
  1314. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/auth-form-mixin.js +0 -0
  1315. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/auth-menu.vue +0 -0
  1316. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/auth-token.vue +0 -0
  1317. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/change-password-dialog.vue +0 -0
  1318. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/login-dialog.vue +0 -0
  1319. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/profile-dialog.vue +0 -0
  1320. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/reset-password-confirm.vue +0 -0
  1321. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/auth/reset-password-request-dialog.vue +0 -0
  1322. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/banner.vue +0 -0
  1323. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/book-cover.scss +0 -0
  1324. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/book-cover.vue +0 -0
  1325. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/browser-header.vue +0 -0
  1326. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/card/browser-card-menu.vue +0 -0
  1327. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/card/card.vue +0 -0
  1328. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/card/controls.vue +0 -0
  1329. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/card/order-by-caption.vue +0 -0
  1330. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/card/remove-cover-button.vue +0 -0
  1331. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/card/subtitle.vue +0 -0
  1332. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/card/upload-cover-button.vue +0 -0
  1333. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/drawer/browser-settings-collection.vue +0 -0
  1334. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/drawer/browser-settings-covers.vue +0 -0
  1335. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/drawer/browser-settings-drawer.vue +0 -0
  1336. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/drawer/browser-settings-misc.vue +0 -0
  1337. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/drawer/browser-settings-panel.vue +0 -0
  1338. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/drawer/browser-settings-saved.vue +0 -0
  1339. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/empty.vue +0 -0
  1340. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/filter-warning-snackbar.vue +0 -0
  1341. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/main.vue +0 -0
  1342. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/table/browser-table-cell.vue +0 -0
  1343. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/table/browser-table-column-picker.vue +0 -0
  1344. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/table/browser-table.vue +0 -0
  1345. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/breadcrumbs/breadcrumbs.vue +0 -0
  1346. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/breadcrumbs/browser-toolbar-breadcrumbs.vue +0 -0
  1347. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/browser-toolbar-title.vue +0 -0
  1348. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/nav/browser-nav-button.vue +0 -0
  1349. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/nav/browser-toolbar-nav.vue +0 -0
  1350. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/search/browser-toolbar-search.vue +0 -0
  1351. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/search/search-combobox.vue +0 -0
  1352. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/search/search-help-text.vue +0 -0
  1353. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/search/search-help.vue +0 -0
  1354. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/select-many/browser-toolbar-select-many.vue +0 -0
  1355. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/browser-toolbar-top.vue +0 -0
  1356. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/columns-button.vue +0 -0
  1357. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/filter-by-select.vue +0 -0
  1358. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/filter-choice-list.vue +0 -0
  1359. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/filter-sub-menu.vue +0 -0
  1360. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/order-by-select.vue +0 -0
  1361. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/order-reverse-button.vue +0 -0
  1362. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/search-button.vue +0 -0
  1363. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/toolbar-button.vue +0 -0
  1364. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/top-collection-select.vue +0 -0
  1365. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/browser/toolbars/top/view-mode-toggle.vue +0 -0
  1366. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/cancel-button.vue +0 -0
  1367. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/clipboard.vue +0 -0
  1368. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/close-button.vue +0 -0
  1369. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/codex-list-item.vue +0 -0
  1370. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/confirm-dialog.vue +0 -0
  1371. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/confirm-footer.vue +0 -0
  1372. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/download-button.vue +0 -0
  1373. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/empty.vue +0 -0
  1374. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/favorite-toggle.vue +0 -0
  1375. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/force-update-button.vue +0 -0
  1376. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/force-update-confirm-dialog.vue +0 -0
  1377. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/mark-read-button.vue +0 -0
  1378. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/edit-mode/clear-field-icon.vue +0 -0
  1379. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/edit-mode/edit-panel.vue +0 -0
  1380. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/expand-button.vue +0 -0
  1381. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-activator.vue +0 -0
  1382. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-body.vue +0 -0
  1383. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-chip.vue +0 -0
  1384. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-controls.vue +0 -0
  1385. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-cover.vue +0 -0
  1386. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-dialog.vue +0 -0
  1387. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-header.vue +0 -0
  1388. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-ratings.vue +0 -0
  1389. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-tags.vue +0 -0
  1390. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/metadata-text.vue +0 -0
  1391. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/table.scss +0 -0
  1392. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/metadata/tags-table.vue +0 -0
  1393. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/online-tag/launcher-dialog.vue +0 -0
  1394. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/online-tag/prompt-popup.vue +0 -0
  1395. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/pagination-nav-button.vue +0 -0
  1396. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/pagination-slider.vue +0 -0
  1397. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/pagination-toolbar.vue +0 -0
  1398. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/placeholder-loading.vue +0 -0
  1399. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/book-change-activator.vue +0 -0
  1400. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/book-change-drawer.vue +0 -0
  1401. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/books-window.vue +0 -0
  1402. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/change-column.scss +0 -0
  1403. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/_expansion-panel-overrides.scss +0 -0
  1404. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/download-panel.vue +0 -0
  1405. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/keyboard-shortcuts-panel.vue +0 -0
  1406. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/keyboard-shortcuts-table.vue +0 -0
  1407. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/reader-settings-controls.vue +0 -0
  1408. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/reader-settings-drawer.vue +0 -0
  1409. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/reader-settings-panel.vue +0 -0
  1410. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/reader-settings-reader.vue +0 -0
  1411. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/reader-settings-scope.vue +0 -0
  1412. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/drawer/settings-indicator-dot.vue +0 -0
  1413. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/empty.vue +0 -0
  1414. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/horizontal-pages.vue +0 -0
  1415. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/page/page-error.vue +0 -0
  1416. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/page/page-img.vue +0 -0
  1417. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/page/page-loading.vue +0 -0
  1418. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/page/page.vue +0 -0
  1419. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/page-change-link.vue +0 -0
  1420. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/pager-horizontal.vue +0 -0
  1421. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/pager-vertical.vue +0 -0
  1422. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/pager.vue +0 -0
  1423. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/pdf-doc.vue +0 -0
  1424. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/pager/scale-for-scroll.vue +0 -0
  1425. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/toolbars/nav/reader-book-change-nav-button.vue +0 -0
  1426. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/toolbars/nav/reader-nav-button.vue +0 -0
  1427. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/toolbars/nav/reader-toolbar-nav.vue +0 -0
  1428. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/toolbars/top/reader-arc-select.vue +0 -0
  1429. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/reader/toolbars/top/reader-toolbar-top.vue +0 -0
  1430. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/scale-button.vue +0 -0
  1431. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/session-error-snackbar.vue +0 -0
  1432. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/settings/button.vue +0 -0
  1433. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/settings/docs-footer.vue +0 -0
  1434. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/settings/opds-dialog.vue +0 -0
  1435. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/settings/opds-url.vue +0 -0
  1436. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/settings/settings-drawer.vue +0 -0
  1437. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/settings/version-footer.vue +0 -0
  1438. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/submit-footer.vue +0 -0
  1439. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/toolbar-select.vue +0 -0
  1440. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/components/unauthorized.vue +0 -0
  1441. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/datetime.js +0 -0
  1442. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/http-error.vue +0 -0
  1443. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/main.js +0 -0
  1444. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/platform.js +0 -0
  1445. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/plugins/drag-scroll.js +0 -0
  1446. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/plugins/router.js +0 -0
  1447. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/plugins/vuetify.js +0 -0
  1448. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/reader.vue +0 -0
  1449. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/route.js +0 -0
  1450. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/admin.js +0 -0
  1451. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/auth.js +0 -0
  1452. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/browser-select-many.js +0 -0
  1453. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/browser.js +0 -0
  1454. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/common.js +0 -0
  1455. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/favorites.js +0 -0
  1456. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/metadata.js +0 -0
  1457. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/online-tag.js +0 -0
  1458. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/reader.js +0 -0
  1459. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/socket.js +0 -0
  1460. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/stores/store.js +0 -0
  1461. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/util.js +0 -0
  1462. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/src/vuetify-items.js +0 -0
  1463. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/__snapshots__/reader-nav-button.test.js.snap +0 -0
  1464. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/auth-store.test.js +0 -0
  1465. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/browser-select-many-store.test.js +0 -0
  1466. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/browser-store-helpers.test.js +0 -0
  1467. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/browser-table-cell.test.js +0 -0
  1468. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/browser-table-column-picker.test.js +0 -0
  1469. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/edit-panel-collections.test.js +0 -0
  1470. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/edit-panel-disabled-tooltips.test.js +0 -0
  1471. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/edit-panel-identifiers.test.js +0 -0
  1472. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/favorite-toggle.test.js +0 -0
  1473. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/favorites-store.test.js +0 -0
  1474. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/launcher-dialog.test.js +0 -0
  1475. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/metadata-activator.test.js +0 -0
  1476. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/metadata-header.test.js +0 -0
  1477. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/profile-dialog.test.js +0 -0
  1478. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/reader-nav-button.test.js +0 -0
  1479. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/reader-store-routes.test.js +0 -0
  1480. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/reset-password-confirm.test.js +0 -0
  1481. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/reset-password-request-dialog.test.js +0 -0
  1482. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/route-helpers.test.js +0 -0
  1483. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/tag-write-errors-panel.test.js +0 -0
  1484. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/tests/unit/tagging-tab.test.js +0 -0
  1485. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/frontend/vite.config.js +0 -0
  1486. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/comic.svg +0 -0
  1487. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/folder.svg +0 -0
  1488. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/imprint.svg +0 -0
  1489. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/logo-maskable.svg +0 -0
  1490. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/logo.svg +0 -0
  1491. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/publisher.svg +0 -0
  1492. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/series.svg +0 -0
  1493. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/story-arc.svg +0 -0
  1494. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/img/volume.svg +0 -0
  1495. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/mkdocs.yml +0 -0
  1496. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/README.md +0 -0
  1497. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/__init__.py +0 -0
  1498. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/conftest.py +0 -0
  1499. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/files/comicbox-2-example.cbz +0 -0
  1500. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/files/comicbox-2-update.cbz +0 -0
  1501. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/files/comicbox.example.yaml +0 -0
  1502. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/files/comicbox.update.yaml +0 -0
  1503. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/importer/__init__.py +0 -0
  1504. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/importer/test_basic.py +0 -0
  1505. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/importer/test_move_timestamps.py +0 -0
  1506. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/importer/test_update_all.py +0 -0
  1507. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/importer/test_update_none.py +0 -0
  1508. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/nginx-local-codex.conf +0 -0
  1509. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/opds_schema.py +0 -0
  1510. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/perf/__init__.py +0 -0
  1511. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/perf/run_baseline.py +0 -0
  1512. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/perf/run_opds_baseline.py +0 -0
  1513. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/perf/run_reader_baseline.py +0 -0
  1514. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/README.md +0 -0
  1515. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/fetch_schemas.py +0 -0
  1516. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v1/atom.rnc +0 -0
  1517. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v1/opds-pse-1.2.rnc +0 -0
  1518. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v1/opds.rnc +0 -0
  1519. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v1/opensearch-1.1.rnc +0 -0
  1520. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/opds/acquisition-object.schema.json +0 -0
  1521. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/opds/authentication.schema.json +0 -0
  1522. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/opds/feed-metadata.schema.json +0 -0
  1523. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/opds/feed.schema.json +0 -0
  1524. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/opds/progression.schema.json +0 -0
  1525. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/opds/properties.schema.json +0 -0
  1526. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/opds/publication.schema.json +0 -0
  1527. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/a11y.schema.json +0 -0
  1528. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/altIdentifier.schema.json +0 -0
  1529. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/article.schema.json +0 -0
  1530. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/chapter.schema.json +0 -0
  1531. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/collection.schema.json +0 -0
  1532. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/contributor.schema.json +0 -0
  1533. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/episode.schema.json +0 -0
  1534. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/extensions/encryption/properties.schema.json +0 -0
  1535. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/extensions/epub/metadata.schema.json +0 -0
  1536. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/extensions/epub/properties.schema.json +0 -0
  1537. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/extensions/epub/subcollections.schema.json +0 -0
  1538. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/issue.schema.json +0 -0
  1539. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/language-map.schema.json +0 -0
  1540. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/link.schema.json +0 -0
  1541. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/metadata.schema.json +0 -0
  1542. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/periodical.schema.json +0 -0
  1543. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/publication.schema.json +0 -0
  1544. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/season.schema.json +0 -0
  1545. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/series.schema.json +0 -0
  1546. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/storyArc.schema.json +0 -0
  1547. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/subcollection.schema.json +0 -0
  1548. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/subject.schema.json +0 -0
  1549. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/schema/opds/v2/readium/volume.schema.json +0 -0
  1550. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_admin_custom_cover.py +0 -0
  1551. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_admin_query_counts.py +0 -0
  1552. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_admin_singleton_settings.py +0 -0
  1553. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_admin_writes.py +0 -0
  1554. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_age_rating_acl.py +0 -0
  1555. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_app_urls.py +0 -0
  1556. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_asgi.py +0 -0
  1557. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_breadcrumbs.py +0 -0
  1558. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_browser_columns_registry.py +0 -0
  1559. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_browser_ordering.py +0 -0
  1560. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_browser_settings_table.py +0 -0
  1561. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_browser_table_columns.py +0 -0
  1562. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_browser_table_response.py +0 -0
  1563. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_credential_validator.py +0 -0
  1564. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_critical_rating.py +0 -0
  1565. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_db_backup.py +0 -0
  1566. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_failed_login_log.py +0 -0
  1567. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_favorites_api.py +0 -0
  1568. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_fs_filters_ignore.py +0 -0
  1569. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_group.py +0 -0
  1570. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_janitor_cleanup_tagging_state.py +0 -0
  1571. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_lazy_import.py +0 -0
  1572. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_logging_filter.py +0 -0
  1573. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_metadata_collection_list.py +0 -0
  1574. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_models.py +0 -0
  1575. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_mtime_gate.py +0 -0
  1576. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_onlinetag_outcome_stats.py +0 -0
  1577. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_onlinetag_prompt_endpoints.py +0 -0
  1578. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_onlinetag_session_manager.py +0 -0
  1579. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_opds_feed.py +0 -0
  1580. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_opds_schema.py +0 -0
  1581. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_password_reset.py +0 -0
  1582. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_poller_stat_refresh.py +0 -0
  1583. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_reader.py +0 -0
  1584. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_registration_settings_patch.py +0 -0
  1585. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_route_serializer.py +0 -0
  1586. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_search_fts.py +0 -0
  1587. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_settings_collection_flip.py +0 -0
  1588. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_shape_identifiers.py +0 -0
  1589. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_tag_by_id.py +0 -0
  1590. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_tag_write_errors.py +0 -0
  1591. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_tag_write_filters.py +0 -0
  1592. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_tagging_validate_endpoint.py +0 -0
  1593. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_user_data_backups.py +0 -0
  1594. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_user_data_dump.py +0 -0
  1595. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_user_data_restore.py +0 -0
  1596. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_user_data_snapshot.py +0 -0
  1597. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_user_data_store.py +0 -0
  1598. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/tests/test_xz.py +0 -0
  1599. {codex-2.0.0a5 โ†’ codex-2.0.0a7}/vulture_ignorelist.py +0 -0
codex-2.0.0a7/PKG-INFO ADDED
@@ -0,0 +1,1041 @@
1
+ Metadata-Version: 2.4
2
+ Name: codex
3
+ Version: 2.0.0a7
4
+ Summary: A comic archive web server.
5
+ Keywords: cb7,cbr,cbt,cbz,comic,pdf
6
+ Author: AJ Slater
7
+ Author-email: AJ Slater <aj@slater.net>
8
+ License-Expression: GPL-3.0-only
9
+ Classifier: Development Status :: 5 - Production/Stable
10
+ Classifier: Environment :: Web Environment
11
+ Classifier: Framework :: Django :: 5.1
12
+ Classifier: Intended Audience :: End Users/Desktop
13
+ Classifier: Natural Language :: English
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: JavaScript
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Topic :: Internet :: WWW/HTTP
18
+ Classifier: Topic :: Multimedia :: Graphics :: Viewers
19
+ Requires-Dist: adrf~=0.1.12
20
+ Requires-Dist: bidict~=0.23
21
+ Requires-Dist: channels~=4.2
22
+ Requires-Dist: comicbox[pdf]~=4.0.0a1
23
+ Requires-Dist: cryptography>=48.0.0
24
+ Requires-Dist: dateparser~=1.2
25
+ Requires-Dist: django-cachalot~=2.8
26
+ Requires-Dist: django-cors-headers~=4.0
27
+ Requires-Dist: django-rest-registration~=0.9
28
+ Requires-Dist: django-vite~=3.1
29
+ Requires-Dist: djangorestframework-camel-case~=1.4
30
+ Requires-Dist: djangorestframework-jsonapi~=8.1
31
+ Requires-Dist: djangorestframework~=3.16
32
+ Requires-Dist: django~=6.0
33
+ Requires-Dist: drf-spectacular~=0.28
34
+ Requires-Dist: granian~=2.7
35
+ Requires-Dist: humanize~=4.12
36
+ Requires-Dist: lark~=1.2
37
+ Requires-Dist: loguru~=0.7.3
38
+ Requires-Dist: nh3~=0.2
39
+ Requires-Dist: pillow~=12.0
40
+ Requires-Dist: psutil~=7.1
41
+ Requires-Dist: servestatic[brotli]~=4.1
42
+ Requires-Dist: setproctitle~=1.3.7
43
+ Requires-Dist: tomli~=2.0 ; python_full_version < '3.11'
44
+ Requires-Dist: typing-extensions~=4.14
45
+ Requires-Dist: tzlocal~=5.0
46
+ Requires-Dist: watchfiles>=1.1.1
47
+ Requires-Dist: zipstream-ng~=1.8
48
+ Requires-Python: >=3.12
49
+ Project-URL: News, https://codex-comic-reader.readthedocs.io/NEWS/
50
+ Project-URL: Documentation, https://codex-comic-reader.readthedocs.io
51
+ Project-URL: Demo, https://demo.codex-reader.app/
52
+ Project-URL: Docker Image, https://github.com/ajslater/codex/pkgs/container/codex
53
+ Project-URL: Issues, https://github.com/ajslater/codex/issues
54
+ Project-URL: Source, https://github.com/ajslater/codex
55
+ Description-Content-Type: text/markdown
56
+
57
+ # Codex
58
+
59
+ A comic archive browser and reader.
60
+
61
+ <img src="/img/logo.svg" style="
62
+ height: 128px;
63
+ width: 128px;
64
+ border-radius: 128px;
65
+ " />
66
+
67
+ > **Note:** The Docker image has moved to
68
+ > [ghcr.io/ajslater/codex](https://github.com/ajslater/codex/pkgs/container/codex).
69
+ > A final `docker.io` image was published on Docker Hub.
70
+
71
+ ## โœจ Features
72
+
73
+ ### ๐Ÿ“š Library
74
+
75
+ - Reads **CBZ, CBR, CB7, CBT and PDF** comics.
76
+ - **Fastest bulk importer** of any comic server.
77
+ - **Watches the filesystem** and auto-imports new or changed comics.
78
+ - **Custom covers** for Folders, Publishers, Imprints, Series, and Story Arcs.
79
+
80
+ ### ๐Ÿ”Ž Browse & Search
81
+
82
+ - Browse a tree of **Publishers, Imprints, Series, Volumes**, your **folder
83
+ hierarchy**, or by tagged **Story Arc**.
84
+ - **Full-text search** across comic metadata and bookmarks.
85
+ - **Filter and sort** on any metadata field, including per-user unread status.
86
+ - A **multi-sortable metadata table** view for power browsing.
87
+ - **Save and load** named views and searches.
88
+ - **Favorites** at the Publisher, Series, Volume, Folder, Story Arc, or Issue
89
+ level โ€” filterable per user.
90
+
91
+ ### ๐Ÿท๏ธ Edit & Tag
92
+
93
+ - **Edit tags** on one or many comics right in the browser โ€” credits, story
94
+ arcs, identifiers, and more โ€” written back to your comic files. Requires the
95
+ comics directory mounted **writable** with filesystem write permission.
96
+ - **Online tagging** looks up and applies metadata from online sources, with
97
+ interactive match prompts and per-source credentials in the Admin Tagging tab.
98
+
99
+ ### ๐Ÿ“– Read
100
+
101
+ - Adapts to any screen with multiple **aspect ratios and reading directions**.
102
+ - **Per-user bookmarks and reading settings**, preserved even without an
103
+ account.
104
+
105
+ ### ๐Ÿ‘ฅ Users & Access
106
+
107
+ - **Anonymous browsing** or registration-required mode โ€” your choice.
108
+ - **Private libraries** restricted to specific groups of users.
109
+ - Optional **age restrictions** for age-tagged comics.
110
+ - Optional **self-service password reset** by email (requires SMTP config).
111
+
112
+ ### ๐Ÿ”Œ Integrations
113
+
114
+ - **OPDS 1 & 2** syndication with streaming, search, and authentication.
115
+ - **Remote-User HTTP header SSO** for reverse-proxy single sign-on.
116
+ - **Fail2Ban** log for IP-banning failed login attempts.
117
+
118
+ ### ๐Ÿชถ Operations
119
+
120
+ - Runs in **1 GB of RAM** (faster with more).
121
+ - **GPLv3** licensed.
122
+
123
+ ### Examples
124
+
125
+ - _Filter by_ Story Arc and Unread, _Order by_ Publish Date to create an event
126
+ reading list.
127
+ - _Filter by_ Unread and _Order by_ Added Time to see your latest unread comics.
128
+ - _Search by_ your favorite character to find their appearances across different
129
+ comics.
130
+
131
+ ## ๐Ÿ‘€ Demonstration
132
+
133
+ You may browse a [live demo server](https://demo.codex-reader.app/) to get a
134
+ feel for Codex.
135
+
136
+ ## ๐Ÿ“œ News
137
+
138
+ Codex has a [NEWS file](NEWS.md) to summarize changes that affect users.
139
+
140
+ ## ๐Ÿ•ธ๏ธ HTML Docs
141
+
142
+ [HTML formatted docs are available here](https://codex-comic-reader.readthedocs.io)
143
+
144
+ ## ๐Ÿ“ฆ Installation
145
+
146
+ ### Install & Run with Docker
147
+
148
+ Run the official
149
+ [Docker Image](https://github.com/ajslater/codex/pkgs/container/codex) at
150
+ ghcr.io/ajslater/codex.
151
+
152
+ Read the [Docker instructions](docs/DOCKER.md)
153
+
154
+ You'll then want to read the [Administration](#administration) section of this
155
+ document.
156
+
157
+ ### Install & Run on HomeAssistant server
158
+
159
+ If you have a [HomeAssistant](https://www.home-assistant.io/) server, Codex can
160
+ be installed with the following steps :
161
+
162
+ - Add the `https://github.com/alexbelgium/hassio-addons` repository by
163
+ [clicking here](https://my.home-assistant.io/redirect/supervisor_add_addon_repository/?repository_url=https%3A%2F%2Fgithub.com%2Falexbelgium%2Fhassio-addons)
164
+ - Install the addon :
165
+ [click here to automatically open the addon store, then install the addon](https://my.home-assistant.io/redirect/supervisor)
166
+ - Customize addon options, then then start the add-on.
167
+
168
+ ### Install & Run as a Native Application
169
+
170
+ You can also run Codex as a natively installed python application with pip.
171
+
172
+ #### Binary Dependencies
173
+
174
+ You'll need to install the appropriate system dependencies for your platform
175
+ before installing Codex.
176
+
177
+ ##### Linux Dependencies
178
+
179
+ ###### Debian Dependencies
180
+
181
+ ...and Ubuntu, Mint, MX, Window Subsystem for Linux, and others.
182
+
183
+ ```sh
184
+ apt install build-essential libimagequant0 libjpeg-turbo8 libopenjp2-7 libssl3 libyaml-0-2 libtiff6 libwebp7 python3-dev python3-pip sqlite3 unrar zlib1g
185
+ ```
186
+
187
+ Versions of packages like libjpeg, libssl, libtiff may differ between flavors
188
+ and versions of your distribution. If the package versions listed in the example
189
+ above are not available, try searching for ones that are with `apt-cache` or
190
+ `aptitude`.
191
+
192
+ ```sh
193
+ apt-cache search libjpeg-turbo
194
+ ```
195
+
196
+ ###### Alpine Dependencies
197
+
198
+ ```sh
199
+ apk add bsd-compat-headers build-base jpeg-dev libffi-dev libwebp openssl-dev sqlite yaml-dev zlib-dev
200
+ ```
201
+
202
+ ##### Install unrar Runtime Dependency on non-debian Linux
203
+
204
+ Codex requires unrar to read CBR formatted comic archives. Unrar is often not
205
+ packaged for Linux, but here are some instructions:
206
+ [How to install unrar in Linux](https://www.unixtutorial.org/how-to-install-unrar-in-linux/)
207
+
208
+ Unrar as packaged for Alpine Linux v3.14 seems to work on Alpine v3.15+
209
+
210
+ ##### macOS Dependencies
211
+
212
+ Using [Homebrew](https://brew.sh/):
213
+
214
+ ```sh
215
+ brew install jpeg libffi libyaml libzip openssl python sqlite unrar webp
216
+ ```
217
+
218
+ #### Windows Installation
219
+
220
+ Windows users are encouraged to use Docker to run Codex, but it will also run
221
+ natively on the Windows Subsystem for Linux.
222
+
223
+ Installation instructions are in the
224
+ [Native Windows Dependencies Installation Document](docs/WINDOWS/).
225
+
226
+ #### Run Codex Natively
227
+
228
+ Once you have installed codex, the codex binary should be on your path. To start
229
+ codex, run:
230
+
231
+ ```sh
232
+ codex
233
+ ```
234
+
235
+ ### Use Codex
236
+
237
+ Once installed and running you may navigate to <http://localhost:9810/>
238
+
239
+ ## ๐Ÿ‘‘ Administration
240
+
241
+ ### Navigate to the Admin Panel
242
+
243
+ - Click the hamburger menu โ˜ฐ to open the browser settings drawer.
244
+ - Log in as the 'admin' user. The default administrator password is also
245
+ 'admin'.
246
+ - Navigate to the Admin Panel by clicking on its link in the browser settings
247
+ drawer after you have logged in.
248
+
249
+ ### Change the Admin password
250
+
251
+ The first thing you should do is log in as the admin user and change the admin
252
+ password.
253
+
254
+ - Navigate to the Admin Panel as described above.
255
+ - Select the Users tab.
256
+ - Change the admin user's password using the small lock button.
257
+ - You may also change the admin user's name with the edit button.
258
+ - You may create other users and grant them admin privileges by making them
259
+ staff.
260
+
261
+ ### Add Comic Libraries
262
+
263
+ The second thing you will want to do is log in as an Administrator and add one
264
+ or more comic libraries.
265
+
266
+ - Navigate to the Admin Panel as described above.
267
+ - Select the Libraries tab in the Admin Panel
268
+ - Add a Library with the "+ LIBRARY" button in the upper left.
269
+
270
+ ### Reset the admin password
271
+
272
+ If you forget all your superuser passwords, you may restore the original default
273
+ admin account by running codex with the `CODEX_RESET_ADMIN` environment variable
274
+ set.
275
+
276
+ ```sh
277
+ CODEX_RESET_ADMIN=1 codex
278
+ ```
279
+
280
+ or, if using Docker:
281
+
282
+ ```sh
283
+ docker run -e CODEX_RESET_ADMIN=1 -v host-parent-dir/config:/config ghcr.io/ajslater/codex
284
+ ```
285
+
286
+ ### ๐Ÿ’พ Backup & Restore User Data
287
+
288
+ Codex's main SQLite database (`codex.sqlite3`) holds two very different kinds of
289
+ data: comic metadata, which can always be rebuilt by re-scanning your library,
290
+ and _user_ data โ€” accounts, bookmarks, favorites, browser settings, library
291
+ definitions, admin flags โ€” which cannot. To make the second kind survive a
292
+ database loss or rebuild, Codex snapshots every user-bound row into a separate
293
+ SQLite file: the **user data sidecar**.
294
+
295
+ #### Where it lives
296
+
297
+ ```text
298
+ <CODEX_CONFIG_DIR>/user_data.sqlite
299
+ ```
300
+
301
+ โ€” right next to `codex.toml`.
302
+
303
+ #### What it contains
304
+
305
+ Users (with hashed passwords), groups & permissions, group memberships,
306
+ libraries and their access lists, bookmarks, favorites, per-user browser
307
+ settings, admin flags, timestamps, and online-tagging defaults.
308
+
309
+ It deliberately does **not** mirror anything derivable from a filesystem
310
+ re-scan: comics, publishers, series, volumes, folders, story arcs, tags,
311
+ credits, the full-text search index. Those rebuild themselves when the librarian
312
+ re-imports your library.
313
+
314
+ #### Taking a snapshot
315
+
316
+ The sidecar is **not** continuously updated. A snapshot is taken:
317
+
318
+ - automatically every night, as part of the existing Janitor sweep (right after
319
+ the database backup); and
320
+ - on demand, whenever you click **Snapshot Now** on the Admin Panel's
321
+ **Restore** tab, or run `Snapshot User Data Sidecar` from the Jobs tab.
322
+
323
+ Each snapshot **replaces** the previous contents โ€” the file is always a true
324
+ point-in-time mirror of the main DB, never a partial log.
325
+
326
+ #### Backing it up offsite
327
+
328
+ Copy `user_data.sqlite` somewhere safe. The file is a single self-contained
329
+ SQLite database; no companion files are required to restore from it (the
330
+ `-wal`/`-shm` siblings, if present, can be left behind).
331
+
332
+ You can copy it while Codex is running, but for the cleanest backup, take a
333
+ fresh snapshot first (Restore tab โ†’ Snapshot Now) and then copy the file.
334
+
335
+ #### Restoring
336
+
337
+ Two equivalent paths:
338
+
339
+ **From the Admin Panel:** open the **Restore** tab and click _Restore Now_. A
340
+ dry-run option reports what _would_ happen without writing.
341
+
342
+ **From the command line:**
343
+
344
+ ```sh
345
+ codex restore_user_data # default sidecar in CODEX_CONFIG_DIR
346
+ codex restore_user_data --dry-run # report only
347
+ codex restore_user_data --from /path/to/another/user_data.sqlite
348
+ ```
349
+
350
+ Both paths are idempotent: re-running a restore on top of an already-restored
351
+ database is safe. Rows whose targets can't be resolved (a deleted comic, a
352
+ renamed tag) are logged to `restore_user_data.log` in your config directory and
353
+ skipped โ€” the operation never aborts.
354
+
355
+ #### Migrating to a new host
356
+
357
+ 1. On the old host, take a fresh snapshot (Restore tab โ†’ Snapshot Now).
358
+ 2. Stop the old Codex.
359
+ 3. Copy `user_data.sqlite` to the new host's config directory.
360
+ 4. Start Codex on the new host with your comics mounted at the same library
361
+ paths.
362
+ 5. Let the librarian finish its initial filesystem scan, then run
363
+ `codex restore_user_data` (or click _Restore Now_ in the admin panel).
364
+
365
+ Bookmarks reattach by comic path, favorites by collection name-chain (e.g.
366
+ publisher โ†’ imprint โ†’ series), and tag filters by tag name. As long as your
367
+ library paths and tag names match, everything reattaches.
368
+
369
+ ### Private Libraries
370
+
371
+ In the Admin Panel you may configure private libraries that are only accessible
372
+ to specific groups.
373
+
374
+ A library with _no_ groups is accessible to every user including anonymous
375
+ users.
376
+
377
+ A library with _any_ groups is accessible only to users who are in those groups.
378
+
379
+ Use the Groups admin panel to create groups and the Users admin panel to add and
380
+ remove users to groups.
381
+
382
+ #### Include and Exclude Groups
383
+
384
+ Codex can make groups for libraries that exclude groups of users or exclude
385
+ everyone and include only certain groups of users.
386
+
387
+ ### PDF Metadata
388
+
389
+ Codex reads PDF metadata from the filename, PDF metadata fields and also many
390
+ formats of common complex comic metadata if they are embedded in the PDF
391
+ `keywords` field.
392
+
393
+ If you decide to include PDFs in your comic library, I recommend taking time to
394
+ rename your files so Codex can find some metadata. Codex recognizes several file
395
+ naming schemes. This one has good results:
396
+
397
+ `{series} v{volume} #{issue} {title} ({year}) {ignored}.pdf`
398
+
399
+ Complex comic metadata, such as ComicInfo.xml, can be also be embedded in the
400
+ keywords field by using the [comicbox](https://github.com/ajslater/comicbox)
401
+ command line tool. Codex will read this data because it relies on comicbox
402
+ internally. Not many people use comicbox or embedded metadata in PDFs in this
403
+ fashion, so you likely won't find it unless you've added it yourself.
404
+
405
+ ### ๐Ÿ—๏ธ API with Key Access
406
+
407
+ Codex has a limited number of API endpoints available with API Key Access. The
408
+ API Key is available on the admin/stats tab.
409
+
410
+ ### ๐Ÿ“ง Email & Password Reset
411
+
412
+ By default Codex has no outbound email and the "Forgot password?" link is
413
+ hidden. To enable self-service password reset, configure SMTP in the Admin
414
+ Panel's **Email** tab โ€” editable without a restart. You must set at least a host
415
+ and either a from-address or user; until then the feature stays off and the
416
+ reset endpoints return 404.
417
+
418
+ The `[email]` section in `codex.toml` (and the `CODEX_EMAIL_*` environment
419
+ variables) is **deprecated**: those values are imported once on upgrade and
420
+ otherwise only seed the initial Admin settings. See the
421
+ [Full `codex.toml` Reference](#full-codextoml-reference) below.
422
+
423
+ Provider-specific notes:
424
+
425
+ - **Gmail**: requires a 16-character App Password (regular passwords are
426
+ rejected by Google's SMTP). Account โ†’ Security โ†’ App Passwords. Use
427
+ `port = 587`, `use_tls = true`, and set `from_address` to the same address as
428
+ `user`.
429
+ - **Amazon SES**: `from_address` MUST be a verified SES identity (the domain or
430
+ address). Use the SMTP credentials from the SES console, not IAM keys
431
+ directly.
432
+ - **Mailgun / SendGrid / generic SMTP relays**: usually accept `user` as the
433
+ authenticated sender; `from_address` defaults to that when blank.
434
+
435
+ If `register_verification` is enabled (Admin โ†’ Flags โ†’ "Verify New User Email"),
436
+ new sign-ups receive an activation email and stay inactive until they click the
437
+ link. Has no effect until email (SMTP) is configured.
438
+
439
+ Existing users created before this feature won't have an email on file and can't
440
+ request a reset; admins can backfill addresses on the Users admin tab, or users
441
+ can set their own via Profile (the user menu).
442
+
443
+ ## ๐ŸŽ›๏ธ Configuration
444
+
445
+ ### Config Dir
446
+
447
+ The default config directory is `config/` directly under the working directory
448
+ you run codex from. You may specify an alternate config directory with the
449
+ environment variable `CODEX_CONFIG_DIR`.
450
+
451
+ The config directory contains a file named `codex.toml` where you can specify
452
+ ports and bind addresses. If no `codex.toml` is present Codex copies a default
453
+ one to that directory on startup. e.g.
454
+
455
+ ```toml
456
+ [server]
457
+ host = "0.0.0.0"
458
+ port = 9810
459
+ url_path_prefix = ""
460
+ ```
461
+
462
+ The config directory also holds the main sqlite database, the `user_data.sqlite`
463
+ sidecar (see [Backup & Restore User Data](#-backup--restore-user-data)), a
464
+ Django cache, and comic book cover thumbnails.
465
+
466
+ ### Full `codex.toml` Reference
467
+
468
+ All available options with their defaults. Uncomment to override. Codex writes
469
+ this file to the config directory on first startup if one is not already
470
+ present.
471
+
472
+ > **Deprecated since v2.0.0:** the `[browser]`, `[throttle]`, and `[email]`
473
+ > sections (and their matching `CODEX_*` environment variables) are now managed
474
+ > in the Admin Panel โ€” browser page size and rate limits on the **Settings**
475
+ > tab, SMTP on the **Email** tab โ€” and are editable without a restart. Values
476
+ > here are imported once on upgrade and otherwise only seed the initial Admin
477
+ > settings. The `[server]`, `[logging]`, `[cache]`, and `[auth]` sections are
478
+ > still configured here.
479
+
480
+ ```toml
481
+ # Codex Configuration File
482
+ # Copy to config/codex.toml and edit as needed.
483
+ # Environment variables override values in this file.
484
+ # See README.md for full documentation.
485
+
486
+ # [server]
487
+ # Granian ASGI server settings
488
+ # host = "0.0.0.0"
489
+ # port = 9810
490
+ # Number of worker processes. 1 is recommended for containerized environments.
491
+ # workers = 1
492
+ # HTTP version: "auto", "1", or "2"
493
+ # http = "auto"
494
+ # Enable websockets (required for Codex live updates)
495
+ # websockets = true
496
+ # HTTP path prefix for codex (e.g. "/codex" for reverse proxy sub-path)
497
+ # url_path_prefix = ""
498
+
499
+ # [logging]
500
+ # Log level: TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL
501
+ # loglevel = "INFO"
502
+ # log_retention = "6 months"
503
+ # log_to_console = true
504
+ # log_to_file = true
505
+ # Directory for log files. Defaults to <config_dir>/logs.
506
+ # log_dir = ""
507
+
508
+ # [cache]
509
+ # Directory for the file-based cache (covers, query results, etc).
510
+ # Defaults to <config_dir>/cache.
511
+ # dir = ""
512
+
513
+ # [browser]
514
+ # Deprecated: now set on the Admin Settings tab (seeds the initial default).
515
+ # max_obj_per_page = 100
516
+
517
+ # [throttle]
518
+ # Deprecated: now set on the Admin Settings tab (seeds initial defaults).
519
+ # Rate limiting (requests per minute). 0 = disabled.
520
+ # anon = 0
521
+ # user = 0
522
+ # opds = 0
523
+ # opensearch = 0
524
+ # Password reset requests per hour, per IP. Defaults to 5.
525
+ # reset_password = 5
526
+
527
+ # [email]
528
+ # Deprecated: now set on the Admin Email tab (seeds initial defaults).
529
+ # SMTP configuration for outbound email. When unset, password-reset and
530
+ # email-verification features stay disabled and the related endpoints
531
+ # respond 404. Set `host` AND `from_address` (or `user`) to enable.
532
+ #
533
+ # IMPORTANT: codex.toml stores credentials in plain text. Restrict file
534
+ # permissions (chmod 600) and consider environment variable overrides
535
+ # (CODEX_EMAIL_PASSWORD) for secrets management systems.
536
+ #
537
+ # host = ""
538
+ # port = 587
539
+ # user = ""
540
+ # password = ""
541
+ # use_tls = true
542
+ # use_ssl = false
543
+ # timeout = 10
544
+ # Sender address. If blank, `user` is used as the From address. Many
545
+ # providers accept the auth user as sender; SES and similar require an
546
+ # explicit verified identity here.
547
+ # from_address = ""
548
+ # subject_prefix = "[Codex] "
549
+
550
+ # [auth]
551
+ # Allows authentication without authorization via the Remote-User header.
552
+ # Only enable if you have authorization in front of Codex. Dangerous.
553
+ # remote_user = false
554
+ # Log failed login attempts to a separate file. Useful as input for
555
+ # banning tools like fail2ban, CrowdSec, or sshguard.
556
+ # Line format: "<ISO timestamp> | Failed login from <ip> user=<username>"
557
+ # Example fail2ban failregex:
558
+ # ^\s*\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \| Failed login from <HOST> user=.*$
559
+ # failed_login_log = false
560
+ # Path to the failed-login log. Defaults to <log_dir>/failed_logins.log.
561
+ # failed_login_log_path = ""
562
+ # When behind a reverse proxy, trust X-Forwarded-For for the client IP.
563
+ # Disable if Codex is exposed directly (otherwise clients can forge their IP).
564
+ # failed_login_log_trust_forwarded_for = true
565
+ ```
566
+
567
+ ### Environment Variables
568
+
569
+ Environment variables override values set in the TOML config file.
570
+
571
+ #### General
572
+
573
+ - `TIMEZONE` or `TZ` will explicitly set the timezone in long format (e.g.
574
+ `"America/Los Angeles"`). This is useful inside Docker because codex cannot
575
+ automatically detect the host machine's timezone.
576
+ - `DEBUG_TRANSFORM` will show verbose information about how the comicbox library
577
+ reads all archive metadata sources and transforms it into a the comicbox
578
+ schema.
579
+ - `CODEX_CONFIG_DIR` will set the path to codex config directory. Defaults to
580
+ `$CWD/config`
581
+
582
+ ##### Server
583
+
584
+ - `GRANIAN_HOST` the IP or hostname to serve Codex from. Defaults to "0.0.0.0",
585
+ all interfaces.
586
+ - `GRANIAN_PORT` the port to serve Codex from. Defaults to 9810.
587
+ - `GRANIAN_WORKERS` Number of worker processes. 1 recommended for containerized
588
+ environments.
589
+ - `GRANIAN_HTTP` HTTP protocol to use. "auto", "1" or "2". Defaults to "auto".
590
+ Generally you want to serve codex from behind nginx or traefik which will
591
+ handle the protocol, even HTTP 3, so this should stay on "auto".
592
+ - `GRANIAN_WEBSOCKETS` Enable websockets. Required for codex live updates.
593
+ Default true.
594
+ - `GRANIAN_URL_PATH_PREFIX` HTTP path prefix for codex (e.g. "/codex" for
595
+ reverse proxy sub-path). Defaults to "".
596
+
597
+ ##### Repair
598
+
599
+ - `CODEX_RESET_ADMIN=1` will reset the admin user and its password to defaults
600
+ when codex starts.
601
+ - `CODEX_FIX_FOREIGN_KEYS=1` will check for and try to repair illegal foreign
602
+ keys on startup.
603
+ - `CODEX_INTEGRITY_CHECK=1` will perform database integrity check on startup.
604
+ - `CODEX_FTS_INTEGRITY_CHECK=1` will perform an integrity check on the full text
605
+ search index.
606
+ - `CODEX_FTS_REBUILD=1` will rebuild the full text search index.
607
+
608
+ #### Logging
609
+
610
+ - `LOGLEVEL` will change how verbose codex's logging is. Valid values are
611
+ `CRITICAL`, `ERROR`, `WARNING`, `SUCCESS`, `INFO`, `DEBUG`, and the overly
612
+ noisy `TRACE`. The default is `INFO`.
613
+ - `CODEX_LOG_DIR` sets a custom directory for saving logfiles. Defaults to
614
+ `$CODEX_CONFIG_DIR/logs`
615
+ - `CODEX_LOG_RETENTION` how long to keep logs. Defaults to "6 months".
616
+ - `CODEX_LOG_TO_FILE=0` will not log to files.
617
+ - `CODEX_LOG_TO_CONSOLE=0` will not log to the console.
618
+
619
+ #### Cache
620
+
621
+ - `CODEX_CACHE_DIR` sets a custom directory for the file-based cache (Django
622
+ cache entries and comic book cover thumbnails). Defaults to
623
+ `$CODEX_CONFIG_DIR/cache`. Useful for placing the cache on a separate (e.g.
624
+ faster or ephemeral) volume from the rest of the config directory.
625
+
626
+ ##### Browser
627
+
628
+ > **Deprecated:** set Browser Page Size on the Admin **Settings** tab instead;
629
+ > this only seeds the initial default.
630
+
631
+ - `CODEX_BROWSER_MAX_OBJ_PER_PAGE` the maximum number of objects per page.
632
+ Defaults to 100.
633
+
634
+ #### Throttling
635
+
636
+ > **Deprecated:** set rate limits on the Admin **Settings** tab instead; these
637
+ > variables only seed the initial defaults.
638
+
639
+ Codex contains some experimental throttling controls. The value supplied to
640
+ these variables will be interpreted as the maximum number of allowed requests
641
+ per minute. For example, the following settings would limit each described group
642
+ to 2 queries per second.
643
+
644
+ - `CODEX_THROTTLE_ANON=30` Anonymous users
645
+ - `CODEX_THROTTLE_USER=30` Authenticated users
646
+ - `CODEX_THROTTLE_OPDS=30` The OPDS v1 & v2 APIs (Panels uses this for search)
647
+ - `CODEX_THROTTLE_OPENSEARCH=30` The OPDS v1 Opensearch API
648
+
649
+ #### Authentication
650
+
651
+ - `CODEX_AUTH_REMOTE_USER` will allow unauthenticated logins with the
652
+ Remote-User HTTP header. This can be very insecure if not configured properly.
653
+ Please read the Remote-User docs devoted to it below.
654
+ - `CODEX_AUTH_FAILED_LOGIN_LOG=1` will append every failed login attempt (form
655
+ login and OPDS Basic auth) to a separate log file for consumption by banning
656
+ tools like fail2ban, CrowdSec, or sshguard. Disabled by default. See the
657
+ [Failed-Login Log](#failed-login-log) section below.
658
+ - `CODEX_AUTH_FAILED_LOGIN_LOG_PATH` overrides the failed-login log path.
659
+ Defaults to `$CODEX_LOG_DIR/failed_logins.log`.
660
+ - `CODEX_AUTH_FAILED_LOGIN_LOG_TRUST_FORWARDED_FOR=0` makes the failed-login log
661
+ use `REMOTE_ADDR` instead of the leftmost `X-Forwarded-For` entry. Default is
662
+ `1` (trust XFF), which is correct when Codex sits behind a reverse proxy. Set
663
+ to `0` when Codex is exposed directly so that clients can't forge
664
+ `X-Forwarded-For` to poison the log.
665
+
666
+ ### Reverse Proxy
667
+
668
+ [nginx](https://nginx.org/) is often used as a TLS terminator and subpath proxy.
669
+
670
+ Here's an example nginx config with a subpath named '/codex'.
671
+
672
+ ```nginx
673
+ # HTTP
674
+ proxy_set_header Host $http_host;
675
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
676
+ proxy_set_header X-Forwarded-Host $server_name;
677
+ proxy_set_header X-Forwarded-Port $server_port;
678
+ proxy_set_header X-Forwarded-Proto $scheme;
679
+ proxy_set_header X-Real-IP $remote_addr;
680
+ proxy_set_header X-Scheme $scheme;
681
+ # Websockets
682
+ proxy_http_version 1.1;
683
+ proxy_set_header Upgrade $http_upgrade;
684
+
685
+ proxy_set_header Connection "Upgrade" location /codex {
686
+ proxy_pass http://codex:9810;
687
+ # Codex reads http basic authentication.
688
+ # If the nginx credentials are different than codex credentials use this line to
689
+ # not forward the authorization.
690
+ proxy_set_header Authorization "";
691
+ }
692
+ ```
693
+
694
+ Specify a reverse proxy sub path (if you have one) in `config/codex.toml`
695
+
696
+ ```toml
697
+ [server]
698
+ url_path_prefix = "/codex"
699
+ ```
700
+
701
+ #### Nginx Reverse Proxy 502 when container refreshes
702
+
703
+ Nginx requires a special trick to refresh dns when linked Docker containers
704
+ recreate. See this
705
+ [nginx with dynamix upstreams](https://tenzer.dk/nginx-with-dynamic-upstreams/)
706
+ article.
707
+
708
+ #### Single Sign On and Third Party Authentication
709
+
710
+ ##### OAuth & OIDC
711
+
712
+ Codex is not an OIDC client at this time. However the following Remote-User and
713
+ Token Authentication methods may assist other services in providing Single Sign
714
+ On.
715
+
716
+ ##### Remote-User Authentication
717
+
718
+ Remote-User authentication tells Codex to accept a username from the webserver
719
+ and assume that authentication has already been done. This is very insecure if
720
+ you haven't configured an authenticating reverse proxy in front of Codex.
721
+
722
+ Here's a snipped for configuring nginx with tinyauth to provide this header.
723
+ This snipped it incomplete and assumes that the rest of nginx tinyauth config
724
+ has been done:
725
+
726
+ ```nginx
727
+ auth_request_set $tinyauth_remote_user $upstream_http_remote_user;
728
+ proxy_set_header Remote-User $tiny_auth_user;
729
+ ```
730
+
731
+ โš ๏ธ Only turn on the `CODEX_AUTH_REMOTE_USER` environment variable if your
732
+ webserver sets the `Remote-User` header itself every time for the Codex
733
+ location, overriding any malicious client that might set it themselves. โš ๏ธ
734
+
735
+ ##### HTTP Token Authentication
736
+
737
+ You can also configure your proxy to add token authentication to the headers.
738
+ Codex will read โ€œBearerโ€ prefixed authorization tokens. The token is unique for
739
+ each user and may be found in the User Profile accessible from the sidebar. You
740
+ must configure your proxy or single sign on software to send this token.
741
+
742
+ ```nginx
743
+ set user_token 'user-token-taken-from-web-ui';
744
+ proxy_set_header Authorization "Bearer $user_token";
745
+ ```
746
+
747
+ ### Failed-Login Log
748
+
749
+ Codex can append every failed login attempt to a dedicated log file in a format
750
+ easy for IP-banning tools (fail2ban, CrowdSec, sshguard, etc.) to parse. The
751
+ feature is off by default. Enable it by setting `CODEX_AUTH_FAILED_LOGIN_LOG=1`
752
+ or in `codex.toml`:
753
+
754
+ ```toml
755
+ [auth]
756
+ failed_login_log = true
757
+ # failed_login_log_path = "" # defaults to <log_dir>/failed_logins.log
758
+ # failed_login_log_trust_forwarded_for = true # set false if exposed directly
759
+ ```
760
+
761
+ A single signal receiver covers both the form login at `/api/v4/auth/login` and
762
+ OPDS HTTP Basic auth โ€” no separate setup per endpoint. The IP-bearing line is
763
+ written **only** to `failed_logins.log`; the main `codex.log` still records
764
+ Django's standard `"Unauthorized: /api/v4/auth/login"` (or `"Forbidden: ..."`)
765
+ WARNING for the same request, so the failure is visible in the main log without
766
+ the client IP. This keeps PII (IP + username) concentrated in one file that you
767
+ can chmod, forward to a SIEM, or retain on its own schedule.
768
+
769
+ Each line looks like:
770
+
771
+ ```log
772
+ 2026-05-10 12:34:56 | Failed login from 192.168.1.42 user=alice
773
+ ```
774
+
775
+ #### X-Forwarded-For trust
776
+
777
+ The client IP is taken from the leftmost `X-Forwarded-For` entry when
778
+ `failed_login_log_trust_forwarded_for = true` (the default), falling back to
779
+ `REMOTE_ADDR`. This is correct when Codex sits behind a reverse proxy that sets
780
+ the header (the typical Docker deployment).
781
+
782
+ If Codex is exposed directly on its port, set
783
+ `failed_login_log_trust_forwarded_for = false` โ€” otherwise a client can set
784
+ their own `X-Forwarded-For: 8.8.8.8` and your banning tool will ban that address
785
+ instead of the real attacker.
786
+
787
+ #### Example fail2ban filter
788
+
789
+ `/etc/fail2ban/filter.d/codex.conf`:
790
+
791
+ ```ini
792
+ [Definition]
793
+ failregex = ^\s*\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \| Failed login from <HOST> user=.*$
794
+ ignoreregex =
795
+ ```
796
+
797
+ `/etc/fail2ban/jail.d/codex.conf`:
798
+
799
+ ```ini
800
+ [codex]
801
+ enabled = true
802
+ filter = codex
803
+ logpath = /path/to/codex/config/logs/failed_logins.log
804
+ maxretry = 5
805
+ findtime = 10m
806
+ bantime = 1h
807
+ ```
808
+
809
+ Validate the filter against a real log with `fail2ban-regex` before enabling the
810
+ jail:
811
+
812
+ ```sh
813
+ fail2ban-regex /path/to/codex/config/logs/failed_logins.log /etc/fail2ban/filter.d/codex.conf
814
+ ```
815
+
816
+ ### Restricted Memory Environments
817
+
818
+ Codex can run with as little as 1GB available RAM. Large batch jobs โ€“like
819
+ importing and indexing tens of thousands of comics at onceโ€“ will run faster the
820
+ more memory is available to Codex. The biggest gains in speed happen when you
821
+ increase memory up to about 6GB. Codex batch jobs do get faster the more memory
822
+ it has above 6GB, but with diminishing returns.
823
+
824
+ If you must run Codex in an admin restricted memory environment you might want
825
+ to temporarily give Codex a lot of memory to run a very large import job and
826
+ then restrict it for normal operation.
827
+
828
+ ## ๐Ÿ“– Use
829
+
830
+ ### ๐Ÿ‘ค Sessions & Accounts
831
+
832
+ Once your administrator has added some comic libraries, you may browse and read
833
+ comics. Codex will remember your preferences, bookmarks and progress in the
834
+ browser session. Codex destroys anonymous sessions and bookmarks after 60 days.
835
+ To preserve these settings across browsers and after sessions expire, you may
836
+ register an account with a username and password. You will have to contact your
837
+ administrator to reset your password if you forget it.
838
+
839
+ ### แฏค OPDS
840
+
841
+ Codex supports OPDS syndication and OPDS streaming. You may find the OPDS url in
842
+ the side drawer. It should take the form:
843
+
844
+ `http(s)://host.tld(:9810)(/path_prefix)/opds/v1.2/`
845
+
846
+ or
847
+
848
+ `http(s)://host.tld(:9810)(/path_prefix)/opds/v2.0/`
849
+
850
+ #### OPDS v1 Clients
851
+
852
+ - iOS
853
+ - [Panels](https://panels.app/)
854
+ - [PocketBooks](https://pocketbook.ch/)
855
+ - [KYBook 3](http://kybook-reader.com/)
856
+ - [Chunky Comic Reader](https://apps.apple.com/us/app/chunky-comic-reader/id663567628)
857
+ - Android
858
+ - [Moon+](https://play.google.com/store/apps/details?id=com.flyersoft.moonreader)
859
+ - [Librera](https://play.google.com/store/apps/details?id=com.foobnix.pdf.reader)
860
+
861
+ Kybook 3 does not seem to support http basic authentication, so Codex users are
862
+ not supported.
863
+
864
+ #### OPDS v2 Clients
865
+
866
+ - iOS & macOS
867
+ - [Stump](https://www.stumpapp.dev/guides/mobile/app) - Technically an
868
+ Alpha, but stable and featureful.
869
+
870
+ - Multi Platform Mobile & Desktop
871
+ - [Readest](https://readest.com/)
872
+
873
+ - Desktop
874
+ - [ComicCatcher](https://github.com/comiccatcher/comiccatcher)
875
+
876
+ #### OPDS Authentication
877
+
878
+ ##### OPDS Login
879
+
880
+ The few clients that implement the OPDS 1.0 Authentication spec present the user
881
+ with a login screen for interactive authentication.
882
+
883
+ ##### HTTP Basic
884
+
885
+ Some OPDS clients allow configuring HTTP Basic authentication in their OPDS
886
+ server settings. If the don't, you will have to add your username and password
887
+ to the URL. In that case the OPDS url will look like:
888
+
889
+ `http(s)://username:password@codex-server.tld(:9810)(/path_prefix)/opds/v1.2/`
890
+
891
+ ##### HTTP Token
892
+
893
+ Some clients allow adding a unique login token to the HTTP headers. Codex will
894
+ read "Bearer" prefixed authorization tokens. The token is unique for each user
895
+ and may be found in the Web UI sidebar.
896
+
897
+ #### Supported OPDS Specifications
898
+
899
+ ##### OPDS v1
900
+
901
+ - [OPDS 1.2](https://specs.opds.io/opds-1.2.html)
902
+ - [OPDS-PSE 1.2](https://github.com/anansi-project/opds-pse/blob/master/v1.2.md)
903
+ - [OPDS Authentication 1.0 (draft)](https://drafts.opds.io/authentication-for-opds-1.0.html)
904
+
905
+ ##### OPDS v2
906
+
907
+ - [OPDS Catalog 2.0](https://specs.opds.io/opds-2.0.html)
908
+
909
+ - [OPDS 2.0 Digital Visual Narratives Profile (DiViNa)](https://github.com/readium/webpub-manifest/blob/master/profiles/divina.md)
910
+
911
+ - [OPDS Authentication 1.0 (draft)](https://drafts.opds.io/authentication-for-opds-1.0.html)
912
+
913
+ - [OPDS Progression 1.0 (draft)](https://drafts.opds.io/opds-progression-1.0.html)
914
+
915
+ - [OPDS 2.0 Authentication (proposal)](https://github.com/opds-community/drafts/discussions/43)
916
+
917
+ ##### OpenSearch v1
918
+
919
+ - [OpenSearch 1.1 (draft)](https://github.com/dewitt/opensearch)
920
+
921
+ ## [๐Ÿฉบ Troubleshooting](#troubleshooting)
922
+
923
+ ### ๐Ÿ“’ Logs
924
+
925
+ Codex collects its logs in the `config/logs` directory. Take a look to see what
926
+ th e server is doing.
927
+
928
+ You can change how much codex logs by setting the `LOGLEVEL` environment
929
+ variable. By default this level is `INFO`. To see more verbose messages, run
930
+ codex like:
931
+
932
+ ```sh
933
+ LOGLEVEL=DEBUG codex
934
+ ```
935
+
936
+ ### Watching Filesystem Events with Docker
937
+
938
+ Codex tries to watch for filesystem events to instantly update your comic
939
+ libraries when they change on disk. But these native filesystem events are not
940
+ translated between macOS & Windows Docker hosts and the Docker Linux container.
941
+ If you find that your installation is not updating to filesystem changes
942
+ instantly, you might try enabling polling for the affected libraries and
943
+ decreasing the `poll_every` value in the Admin console to a frequency that suits
944
+ you.
945
+
946
+ ### Emergency Database Repair
947
+
948
+ If the database becomes corrupt, Codex includes a facility to rebuild the
949
+ database. Place a file named `rebuild_db` in your Codex config directory like
950
+ so:
951
+
952
+ ```sh
953
+ touch config/rebuild_db
954
+ ```
955
+
956
+ Shut down and restart Codex.
957
+
958
+ The next time Codex starts it will back up the existing database and try to
959
+ rebuild it. The database lives in the config directory as the file
960
+ `config/codex.sqlite3`. If this procedure goes kablooey, you may recover the
961
+ original database at `config/backups/codex.sqlite3.before-rebuild.bak`. Codex
962
+ will remove the `rebuild_db` file.
963
+
964
+ ### Warnings to Ignore
965
+
966
+ #### StreamingHttpResponse Iterator Warning
967
+
968
+ ```pycon
969
+ packages/django/http/response.py:517: Warning: StreamingHttpResponse must consume synchronous iterators in order to serve them asynchronously. Use an asynchronous iterator instead.
970
+ ```
971
+
972
+ This is a known warning and does not represent anything bad happening. It's an
973
+ artifact of the Django framework slowly supporting asynchronous server endpoints
974
+ and unfortunately isn't practical to remove yet.
975
+
976
+ ## ๐Ÿ“šAlternatives to Codex
977
+
978
+ - [Kavita](https://www.kavitareader.com/) has light metadata filtering/editing,
979
+ supports comics, eBooks, and features for manga.
980
+ - [Komga](https://komga.org/) has light metadata editing and duplicate page
981
+ elimination.
982
+ - [Ubooquity](https://vaemendis.net/ubooquity/) reads both comics and eBooks.
983
+
984
+ ## ๐Ÿ”ง Popular comic utilities
985
+
986
+ - [Mylar](https://mylar.nerdfirehurricane.com/) is the best comic book manager
987
+ which also has a built in reader.
988
+ - [Metron Tagger](https://github.com/Metron-Project/metron-tagger) is a command
989
+ line comic metadata editor. It will tag identified comics from online database
990
+ sources.
991
+ - [Comictagger](https://github.com/comictagger/comictagger) is a comic metadata
992
+ editor. It comes with a command line and desktop GUI. It will tag identified
993
+ comics from online database sources.
994
+ - [Comicbox](https://comicbox.readthedocs.io/) is a powerful command line comic
995
+ metadata editor and multi metadata format synthesizer. It is what Codex uses
996
+ under the hood to read comic metadata.
997
+
998
+ ## ๐Ÿค Contributing
999
+
1000
+ ### ๐Ÿ› Bug Reports
1001
+
1002
+ Issues and feature requests are best filed on the
1003
+ [Github issue tracker](https://github.com/ajslater/codex/issues).
1004
+
1005
+ ## ๐Ÿ’ฌ Support
1006
+
1007
+ I and other Codex users answer questions on the
1008
+ [Codex Comic Server Discord](https://discord.gg/CU5kKxv7kg)
1009
+
1010
+ ### ๐Ÿ›  Develop
1011
+
1012
+ Codex's git repo is mirrored on [Github](https://github.com/ajslater/codex/)
1013
+
1014
+ Codex is a Django Python webserver with a VueJS front end.
1015
+
1016
+ `/codex/codex/` is the main django app which provides the webserver and
1017
+ database.
1018
+
1019
+ `/codex/frontend/` is where the vuejs frontend lives.
1020
+
1021
+ Most of Codex development is now controlled through the Makefile. Type `make`
1022
+ for a list of commands.
1023
+
1024
+ ## ๐Ÿ”— Links
1025
+
1026
+ - [Docker Image](https://github.com/ajslater/codex/pkgs/container/codex)
1027
+ - [PyPi Package](https://pypi.org/project/codex/)
1028
+ - [GitHub Project](https://github.com/ajslater/codex/)
1029
+
1030
+ ## ๐Ÿ™๐Ÿป Thanks
1031
+
1032
+ - Thanks to [Aurรฉlien Mazurie](https://pypi.org/user/ajmazurie/) for allowing me
1033
+ to use the PyPi name 'codex'.
1034
+ - To [ProfessionalTart](https://github.com/professionaltart) for providing
1035
+ native Windows installation instructions.
1036
+ - Thanks to the good people of [Mylar](https://mylar.nerdfirehurricane.com/)
1037
+ continuous feedback and comic ecosystem education.
1038
+
1039
+ ## ๐Ÿ˜Š Enjoy
1040
+
1041
+ ![These simple people have managed to tap into the spiritual forces that mystics and yogis spend literal lifetimes seeking. I feel... ...I feel...](docs/strange.jpg)