about summary refs log tree commit diff
path: root/web/panettone
AgeCommit message (Collapse)AuthorFilesLines
2021-01-25 r/2144 feat(panettone): render a subset of markdown in issue subjectssterni6-4/+198
This is achieved by implementing a simple markdown renderer in CL which has the following limitations: * Only supports inline `code`, *emphasize 1*, _emphasize 2_ and ~~strikethrough~~. * Does not support nested markup. This allows for a relatively simple renderer which doesn't need to parse markdown into a in-memory data structure first. The rendered result is directly written to a stream to integrate well with cl-who which is also reused for rendering tags and xml-escaping strings. Fixes #90. Change-Id: Ice88ed770b1fab6365f3b93e8663e25077befa0b Reviewed-on: https://cl.tvl.fyi/c/depot/+/2389 Tested-by: BuildkiteCI Reviewed-by: glittershark <grfn@gws.fyi> Reviewed-by: tazjin <mail@tazj.in>
2021-01-25 r/2143 fix(panettone): escape value attr of inputs if dynamic contentsterni1-2/+3
I checked all :value attributes in panettone.lisp and wrapped them with who:escape-string if its value comes from user-influenced places. Static values or values from panettone internals are left as is. I did not do a comprehensive check for other places where something similar could happen though. Fixes #92. Change-Id: I134acc0d2f025f173588b37c19a93589365e879b Reviewed-on: https://cl.tvl.fyi/c/depot/+/2401 Tested-by: BuildkiteCI Reviewed-by: glittershark <grfn@gws.fyi>
2020-11-27 r/1928 fix(panettone): only scroll if content is too wideAlyssa Ross1-1/+1
Guessing Griffin uses a Mac with invisible scroll bars. ;-) Change-Id: I1771f941f149d5ab5816e67861b6bcd91001e652 Cc: Griffin Smith <grfn@gws.fyi> Reviewed-on: https://cl.tvl.fyi/c/depot/+/2163 Tested-by: BuildkiteCI Reviewed-by: glittershark <grfn@gws.fyi>
2020-11-22 r/1904 fix(panettone): Prefix all IRC messages with a ZWSPGriffin Smith1-1/+4
Prefix all IRC notifications from panettone with a unicode zero-width-space so that they don't get picked up by other IRC bots (notably bslsk05). Change-Id: I350fd1b6d2145e496c22a8f56ba3530fc9f1a978 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2127 Tested-by: BuildkiteCI Reviewed-by: lukegb <lukegb@tvl.fyi> Reviewed-by: tazjin <mail@tazj.in>
2020-11-22 r/1903 feat(panettone): Send notifications when issues are closedGriffin Smith1-5/+14
Send an irc notification when issues are marked closed, in a similar format to the notifications sent when new issues are created. Change-Id: I2fdde33f0dedc223a5c2265eed778161938f8e9a Reviewed-on: https://cl.tvl.fyi/c/depot/+/2126 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-11-22 r/1896 feat(panettone): Bring back + fix irccat issue creation announcementGriffin Smith4-6/+43
This reverts commit e1067b1497b3dea0c37ae51bba21f42f1e7d35b5. The original issue here was misusing ISSUE-ID instead of ID, but also the associated username for the message should've been CN instead of DN Change-Id: I1629c0cb7597ff2ee2867f27870378eecdafe126 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2125 Tested-by: BuildkiteCI Reviewed-by: eta <eta@theta.eu.org>
2020-11-19 r/1884 revert(panettone): announce newly created issues using irccatglittershark4-38/+4
This reverts commit 2e2bdf9c6ce1cd66ba5cfe1a42786a6f486b7969. Reason for revert: this is not working, and is resulting in newly created issues just showing a blank page (b/74) Change-Id: I3f06afc52d6c5289269402fc75bb32ad9c376bf4 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2082 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-11-08 r/1877 feat(panettone): announce newly created issues using irccateta4-4/+38
- The new PANETTONE.IRC package contains the SEND-IRC-NOTIFICATION function, which opens a new TCP socket to irccat (if it's running and configured) in order to announce the creation of new issues. - The IRCCATHOST and IRCCATPORT environment variables must be set for this to work. - Additionally, the ISSUECHANNEL environment variable may be used to direct announcements at a given channel (otherwise it'll just use the first one). Change-Id: I429a66f24d0f80ed10db173d6af7105fb1d3d023 Reviewed-on: https://cl.tvl.fyi/c/depot/+/2077 Tested-by: BuildkiteCI Reviewed-by: glittershark <grfn@gws.fyi>
2020-09-14 r/1790 fix(panettone): Make pre blocks overflow-x scrollGriffin Smith1-1/+3
This prevents wide code blocks from displaying over the container element. Fixes: b/53 Change-Id: I44cb5ff4eddf4c01bb706069a68618382b0dc7ba Reviewed-on: https://cl.tvl.fyi/c/depot/+/1934 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-08-31 r/1746 fix(panettone): Automatically reconnect to ldapGriffin Smith3-17/+55
Wrap all ldap access in a macro that automatically reconnects and retries operations that fail due to a connection error, to handle the case where the ldap server restarts while we still have an open connection. Fixes: #44 Change-Id: I4859cf509106e480f97fed17e7f08e0eea909352 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1871 Tested-by: BuildkiteCI Reviewed-by: eta <eta@theta.eu.org>
2020-08-29 r/1737 feat(panettone): Add nav to the top of the page as wellGriffin Smith3-24/+33
The absence of the navbar containing the "all issues" and "log out" links from the top of the page has been a common complaint - initially I disagreed, but after some time thinking about it I've come around. This adds the same nav - with the "All Issues" link and the "Log Out" link - to the top of every page, and also fixes a bug where query params would prevent the "All Issues" link from being hidden on the "All Issues" page, which looked especially weird when they were right next to each other. Change-Id: I1d07175fa07aee057ddd140a6864d01342fbb7ef Reviewed-on: https://cl.tvl.fyi/c/depot/+/1868 Reviewed-by: kanepyork <rikingcoding@gmail.com> Tested-by: BuildkiteCI
2020-08-29 r/1734 feat(panettone): Add styling for blockquotesGriffin Smith1-0/+7
Style blockquotes (which show up in rendered markdown) similarly to how github does, by rendering a 5px-wide margin to the left with some padding. Fixes: #48 Change-Id: I79aa3b6cda5d928885c2cc36f504009232252c17 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1869 Tested-by: BuildkiteCI Reviewed-by: eta <eta@theta.eu.org>
2020-08-28 r/1731 feat(panettone): Increase session timeout to 90 daysGriffin Smith1-0/+2
The default was really annoyingly short - 90 days feels perfectly fine for what we want, though we may want to increase even further. Fixes: #19 Change-Id: I917abd95c4925f8491cd2be7cd87d91bb6621153 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1867 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com>
2020-08-28 r/1730 feat(panettone): Configure a session secretGriffin Smith1-4/+13
Load a SESSION_SECRET env var and set it as the hunchentoot session secret if present, so that restarting panettone doesn't destroy all sessions due to the secret getting regenerated. Refs: #19 Change-Id: Ia2c633fa998e128ecece66e824df01c430da8235 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1866 Reviewed-by: kanepyork <rikingcoding@gmail.com> Tested-by: BuildkiteCI
2020-08-09 r/1628 fix(web/panettone): revert "implement shorthand issue URLs"glittershark2-16/+6
This reverts commit 311511385455f680aedf78aab761fcebf3ca7731. Reason for revert: this is causing all issues to return a 404 - reverting until we can get it working. Change-Id: I5f3c5ec3b24f245a1f7ef12645200d16ed0f1b35 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1721 Tested-by: BuildkiteCI Reviewed-by: edef <edef@edef.eu>
2020-08-08 r/1617 feat(web/panettone): implement shorthand issue URLsedef2-6/+16
Fix #32 Change-Id: I6ccec959201673850b4b56a44734a2874aad5856 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1648 Reviewed-by: glittershark <grfn@gws.fyi> Reviewed-by: edef <edef@edef.eu> Tested-by: BuildkiteCI
2020-08-03 r/1564 fix(web/panettone): Fix more calls to (id nil) in new issue formGriffin Smith1-32/+35
Change-Id: Id514d80e00005b7b7eb2f305e92af33ca70d6964 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1594 Tested-by: BuildkiteCI Reviewed-by: lukegb <lukegb@tvl.fyi>
2020-08-03 r/1563 fix(web/panettone): Fix new issue formGriffin Smith1-1/+2
Passing a nil issue to this was breaking because you can't get the id of nil. I am too used to clojure. Change-Id: Icf76cbb23d902ec59fa97c21b134936fa40eb43e Reviewed-on: https://cl.tvl.fyi/c/depot/+/1593 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-08-02 r/1547 feat(web/panettone): Add direct anchor links to commentsGriffin Smith2-12/+23
Fixes: #31 Change-Id: I5a8228229eb2b68bdfc5addd305ab055443aa5a6 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1581 Reviewed-by: lukegb <lukegb@tvl.fyi> Tested-by: BuildkiteCI
2020-08-02 r/1539 feat(web/panettone): Allow editing issuesGriffin Smith4-41/+146
Allow editing both the subject and the body of issues, recording events indicating the edit and displaying those events in the issue history. Fixes: #14 Change-Id: I9ed05271ce9bf6bda4e56f15e249c0f28c862b27 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1517 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-08-01 r/1517 fix(web/panettone): Don't try to markdownify eventsGriffin Smith1-3/+3
Events - which are interleaved with comments - don't have bodies, so they can't be converted to markdown. Change-Id: Iba818b95dab59cae5a08c8b4eca94955e11e584b Reviewed-on: https://cl.tvl.fyi/c/depot/+/1509 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-31 r/1511 feat(web/panettone): Render issues+comments as MarkdownGriffin Smith3-4/+64
Use the new cheddar markdown endpoint to render issue bodies and comment bodies as JSON. I've checked, and this *also* appears to be XSS safe (yay) Change-Id: Ib4b19fd581b0cf40ba03f5d13443535d17df6632 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1500 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
2020-07-31 r/1510 feat(web/panettone): Display issue historyGriffin Smith4-34/+80
Display the history of an issue (which currently is just opening and closing) inline with the issue's comments on the issue show page Change-Id: Id167bceef765cb4c24e86983d1dcd6624d0e5956 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1497 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-31 r/1509 feat(web/panettone): Log when users change issue statusesGriffin Smith7-112/+215
Log in the database, in a way that will generalize to tracking edit history as well, when users change the status of an issue. To facilitate easily knowing who is currently authenticated (without introducing a circular dependency) the authentication-relaated code has also been factored out into its own package, which is nice because we want to replace that sooner rather than later anyway. Fixes: #13 Change-Id: I65a544fab660ed1c295ee8f6b293e0d4945a8203 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1496 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-31 r/1508 feat(web/panettone): persist original-uri through failed authGriffin Smith1-1/+2
Even if the user fails to log in, maintain the original-uri param if present, so that if they eventually succeed at logging in they still get where they were originally trying to get. Change-Id: I2faa5eced002ab899c803cf19095cea76897d92d Reviewed-on: https://cl.tvl.fyi/c/depot/+/1499 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-31 r/1507 feat(web/panettone): Redirect to original URL after loginGriffin Smith1-1/+6
Add an original-uri query param to the target of the Log In link pointing at the current URL, so that when the user eventually successfully logs in they are redirected to the page they were originally on Fixes: #21 Change-Id: I75ed7b75fa00b1b09c8b26bf4dcf5bc6b6d7f53a Reviewed-on: https://cl.tvl.fyi/c/depot/+/1498 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-29 r/1505 refactor(web/panettone): Remove prevalenceGriffin Smith3-113/+4
Now that we've migrated over all the data to postgresql, we can get rid of cl-prevalence as a dependency from Panettone along with all code that mentions it. Change-Id: I945f50a88fea5770aac5b4a058342b8269c0bea2 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1495 Reviewed-by: kanepyork <rikingcoding@gmail.com> Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
2020-07-28 r/1501 fix(web/panettone): Fix reference to undefined functionGriffin Smith1-1/+1
I have been. Very tired. Change-Id: Iab9d21e53630be092080cc73196da90534b06553 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1490 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-28 r/1498 fix(panettone): Add missing util.lisp to buildGriffin Smith1-0/+1
Change-Id: Id2fdd84145712d75f23844ad1ececa835cec6a84 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1487 Reviewed-by: glittershark <grfn@gws.fyi> Tested-by: BuildkiteCI
2020-07-28 r/1497 feat(panettone): Use postgres as the storage backendGriffin Smith5-116/+394
Switch from cl-prevalence to postgres (via postmodern) as the storage backend for panettone. The first time the application starts up after this commit, it will (idempotently) initialize the db schema and migrate over all data from the prevalence snapshot to the database - the plan is then to get rid of the prevalence classes and dependency once that's deployed. Change-Id: I4f35707efead67d8854f1c224ef67f8471620453 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1467 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in> Reviewed-by: eta <eta@theta.eu.org>
2020-07-26 r/1486 feat(web/panettone): Add dev helpers for postgres dbGriffin Smith3-0/+27
Add a docker-compose file and lorri-based direnv for aiding in running and connecting to a postgres database during development of panettone. Change-Id: I319eee52b52cd48e1f3d2e32c558989768dc19d8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1465 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in> Reviewed-by: eta <eta@theta.eu.org>
2020-07-26 r/1484 fix(web/panettone): Don't log backtracesGriffin Smith1-0/+2
The default hunchentoot behavior is to log all local variables when logging lisp backtraces - this is nice for debugging, but means that if we hit an error when checking for auth with the ldap server we log the password provided by the user. No good! Let's just turn off logging of backtraces for now. Change-Id: Ibc4242e3e0f974ac53fffc482d3724b0547425ab Reviewed-on: https://cl.tvl.fyi/c/depot/+/1471 Reviewed-by: glittershark <grfn@gws.fyi> Tested-by: BuildkiteCI
2020-07-26 r/1481 chore(web/panettone): ignore .fasl filesGriffin Smith1-0/+1
Sly spits these out as a result of the various compile commands, but we don't want them committed. Change-Id: I6f45b6de6dc978667a0575d0ed361c573045ef92 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1464 Reviewed-by: kanepyork <rikingcoding@gmail.com> Tested-by: BuildkiteCI
2020-07-25 r/1467 feat(web/panettone): Make responsiveGriffin Smith2-3/+5
Make the site responsive, by making all the hard :widths we were using into :max-widths, and adding a viewport meta tag. Change-Id: I02f054f81ff57fbd1c4603b179b2104367f03e3b Reviewed-on: https://cl.tvl.fyi/c/depot/+/1415 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-24 r/1461 fix(web/panettone): Fix html5 complianceGriffin Smith1-10/+12
- who:html-mode needs to be html5 rather than HTML5 apparently, even though the documentation says otherwise - wrap content in an :html tag with the :lang "en" attribute Fixes: #22 Change-Id: I58ff8947d17ac02659e4c8d98155f57127ec7005 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1421 Tested-by: BuildkiteCI Reviewed-by: isomer <isomer@tvl.fyi>
2020-07-24 r/1455 feat(web/panettone): Make issues visible publiclyGriffin Smith1-21/+31
Make auth optional on the index, closed-issues, and view-issue pages, and only render the various buttons (close issue, new issue, make comment, etc.) if the user is authenticated. Fixes: #5 Change-Id: I0a2aaf4a7cc4c5ef0494cc183410f00d2a3b7e06 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1414 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-24 r/1454 feat(web/panettone): Add a Log Out link to the footerGriffin Smith2-18/+53
Generalize the rendering of the footer nav, and add a Log Out button to the right. Change-Id: I107e2370fd8f12949218ecacb611649a48abd738 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1413 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-24 r/1453 feat(web/panettone): Add "All Issues" link on issue pageGriffin Smith2-1/+13
This was something that was complained about verbally - if someone gets a link to an issue directly it's nice to be able to click on a link to view all issues. Change-Id: Id4e0c7208edc51980c6577bb10e6c6dea1e7ab55 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1412 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com>
2020-07-24 r/1452 feat(web/panettone): Redirect to original URI after loginGriffin Smith2-9/+17
Once the user authenticates, redirect them to the original URI they were trying to get to Fixes: #7 Change-Id: Id7c8cbe3547923f6c4c5faed180ea8ea6528fddd Reviewed-on: https://cl.tvl.fyi/c/depot/+/1411 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com>
2020-07-24 r/1450 feat(web/panettone): Add issue subject to page titleGriffin Smith1-1/+4
Fixes: #8 Change-Id: I5513018e6d4908881a3522a24764729f2638b521 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1408 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com>
2020-07-24 r/1449 feat(web/panettone): Disallow comments with an empty bodyGriffin Smith1-10/+14
Change-Id: Ic77a0caf419389e8460bf7e5688293f3a588caa4 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1405 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com>
2020-07-24 r/1448 feat(web/panettone): Disallow issues with an empty subjectGriffin Smith2-10/+25
Disallow creating issues with an empty subject, and render a nice(ish) alert box indicating the error. Change-Id: I2857923dc0eb7702c85cd1974a73270ca27720fc Reviewed-on: https://cl.tvl.fyi/c/depot/+/1404 Reviewed-by: kanepyork <rikingcoding@gmail.com> Tested-by: BuildkiteCI
2020-07-23 r/1446 fix(web/panettone): Fix failure on invalid usernameGriffin Smith1-11/+11
Handle if the username submitted to the login form is one of a nonexistent user, rather than returning a 500 Fixes: #1 Change-Id: Iebc68dea3c91dc928e4386cb172d3c1515fb1556 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1402 Tested-by: BuildkiteCI Reviewed-by: kanepyork <rikingcoding@gmail.com>
2020-07-23 r/1445 fix(web/panettone): Put snapshot in the right placeGriffin Smith1-1/+5
For some reason cl-prevalence tries to put the snapshot in the *parent directory* of the directory that's passed to make-prevalence-system. This is icky, but this should work around it Fixes: #2 Fixes: #3 Fixes: #4 Change-Id: I8300246275887653586108cd7b3b033df3bca203 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1401 Tested-by: BuildkiteCI Reviewed-by: isomer <isomer@tvl.fyi>
2020-07-23 r/1444 feat(web/panettone): Add issue statusesGriffin Smith2-49/+138
Add support for issue statuses, which is currently a trivial groupoid of open and closed. On the show page for open issues there's a Close button, and on the show page for closed issues there's a Reopen button. In addition, the index page is filtered by open issues only and there's a link to view closed issues. Change-Id: I6c0c3d2e874b1c801e9e06c804f5c1b12db5dbdc Reviewed-on: https://cl.tvl.fyi/c/depot/+/1352 Tested-by: BuildkiteCI Reviewed-by: glittershark <grfn@gws.fyi>
2020-07-23 r/1443 feat(web/panettone): Add support for commentsGriffin Smith2-7/+78
Add a new-comment form and list all issue comments on the issue page Change-Id: Ia74083484614ba0ca0f2879276f717f709d0f42f Reviewed-on: https://cl.tvl.fyi/c/depot/+/1351 Tested-by: BuildkiteCI Reviewed-by: eta <eta@theta.eu.org>
2020-07-23 r/1442 feat(web/panettone): Add initial stylesGriffin Smith5-62/+236
Take an initial crack at styling most of the Panettone application, taking inspiration from the styles from todo.tvl.fyi and tvl.fyi itself. This uses the LASS CSS library, after a brief attempt at using css-lite which I ended up not going with because I don't like the library's design very much, and also it's not compatible with sbcl's (safety 3) (some macroexpansions SETQ undeclared variables). Change-Id: I054402e4c68ae1e99884d5164e6e2fc39d2779ff Reviewed-on: https://cl.tvl.fyi/c/depot/+/1350 Tested-by: BuildkiteCI Reviewed-by: eta <eta@theta.eu.org>
2020-07-23 r/1441 feat(web/panettone): Display who opened issues and whenGriffin Smith2-8/+39
Add a line to the issue show page displaying who opened the issue and when, the latter formatted in dottime. Change-Id: Ie70d7fd9e62ae92f9a479969d4ea21daddccee40 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1345 Reviewed-by: glittershark <grfn@gws.fyi> Tested-by: BuildkiteCI
2020-07-23 r/1438 feat(web/panettone): Read config from envGriffin Smith1-11/+23
Read the port and data directory from environment variables, in preparation for deploying as a systemd unit to Whitby Change-Id: I066dced7b7926b6bdc77132d13a4da6c886b20e8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1338 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>
2020-07-23 r/1433 feat(web/panettone): The start of a very simple issue trackerGriffin Smith4-0/+321
Initial commit for Panettone, a very simple issue tracker for TVL. In its current state this launches a web server with authenticates with our ldap server, and supports listing and creating issues via static html pages and simple forms. We've been needing an issue tracker for a while now, but none of the options out there seem very good - or there are some good ones, but they're AGPL licensed and we don't want to deal with them. Rather than muck around with Trac or Bugzilla, we've decided to write our own. Change-Id: I704f0996d15199329bbd5450f3d959046bf13973 Reviewed-on: https://cl.tvl.fyi/c/depot/+/1337 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in>