- New Guides
- fix: improved first time onboarding for a new user for spaced-repetition
- feat: able to queue up multiple lists as a sequence, used via the guides to slowly teach the user all sections of a guide
- feat: a view screen for spaced repetition item
- fix: seo friendly names for the tools in the toolbox
- fix: modal supports a primary button
- fix: og-image now returns the correct image for "/"
- fix: deleting a user is fenced, to stop race conditions on future events being published

PR 601 Commit f076503

- feat: mirror event log service
- dev experience, around how to access secrets
- seo: improved for items not in sitemap
- doc: whoami data
- content: Guide template
- content: Norwegian Football World Cup Words And Phrases
- content: Norwegian Maternity Words And Phrases
- content: Norwegian Phrases For Immigrants In Norway
- content: Norwegian Sentence Examples By Tense
- content: Norwegian Sick Day Messages For Kindergarten And School
- content: Norwegian Verbs For Beginners
- content: Norwegian Learning Guides
- content: Spanish Sentence Examples By Tense
- content: Spanish Verbs For Beginners
- content: 30 Day Plank Challenge App Guide
- tool: Create pdf with spaced repetition menu
- feat: Creation of lists defaults to showing slideshow
- bug: modal appears on screen, not top of screen if out of view
- fix: removed stan
- fix: og:image render no longer happening on hot loop in static file generation
- fix: practice lists keep metadata if exists

PR 595 Commit 2bee49c

- seo: Improvement of seo related html tags across the site
- feat: og image for all pages
- fix: Using caddy for redirects
- fix: Better validation in 30 day challenge
- fix: tool just-one-thing, the intro is viewable without login
- feat: meatadata supports groupid

PR 594 Commit 840c755

- feat: infrastructure for "share-data", sharing user defined data with realtime
- feat: metadata to list, list items, planks, spaced repetition entries
- feat: 30 day plank challenge
- feat: delta support on lists
- bug: unjumble using relative path in intro doc
- bug: watching for KV changes in nats no longer uses consumer

Closes #436 #592 #337

PR 593 Commit e821139

- Development setup now is made to work with arm, not amd
- Cleaned up openapi to use one in golang.
- Developer experience greatly improved (.build folder)
- Upgraded sqlite (3.53.1-r0)
- Upgraded yq to v4
- Added production resource limits
- Moved from Stan to Jetstream
- Upgraded k3s to be the same in production and development (rancher/k3s:v1.35.3-k3s1)
- Ingress in development and production are now the same.
- Turned off stan + stan2monolog
- Renamed learnalist deployment to learnalist-api, making it easier to see.

Resolves #265, #525, #386, #189, #128, #554, #535

PR 591 Commit 7e8b153

- feat: Reactions api, enabling challenge memebers to like a plank
- feat: Able to delete a mobile device token
- tidy: shutdown of nats handlers
- bug: fixed an issue with daily light savings.

Resolved #579

PR 584 Commit 44362f8

- seo: we have a /sitemap.xml
- seo: using canonical links, jsonld, open-grapth and twitter
- docs: Add an AI skill to help with seo
- chore: updating hugo to v0.157.0
- fix: log build output for static-site when profile enabled

Resolves #582

PR 583 Commit 7594f2e

- feat: Support updated_at in the api contract for challenge(s) endpoints
- fix: added push notifications to base and have it working in staging
- feat: maintenance mode, so I can provide a custom 503 with a header, signalling service down, please try again
- fix: tidy up one smoke file with mix of openapi versions

Resolves #574  #578

PR 581 Commit b2b5d1a

- delta support for spaced repetition
- db-management: one source of truth for database schema + migration binary
- Make local + staging + production use similiar file structure for databases.
- Updated sqlite to 3.50.4-r1

Resolves #577

PR 580 Commit dbb211b

Improvements
* Plank deltas to make syncing lighter
* Challenge deltas to make syncing lighter

Fixess
* Fixed bug in allowing loops when interacting with unjumble
* Reporting remote_ip correctly in the logs

PR 576 Commit a244575

* fix: Learnalist mobile app is now called Learnalist: Learning Lists
* fix: When not authorized a 401 is sent, no longer 403

PR 573 Commit 7de1cae

* feat: dding freshteapot.net to k8s infra
* fix: Show options when selecting overtime for v2
* feat: A tool to craft a chatgpt prompt to generate content for learnig based on translations
* doc: setting up ssl certs
* doc: habitpress
* fix: removed unused flags from hugo
* feat: confirms looking up data from the user table
* fix: hardcoding path to mockery in Makefile
* feat: stan2nats sub command to stream the monolog from stan into jetstream
* fix: stats is using jetstream
* fix notifications served via jetstream
* fix: srs unread + srs activity + user stats to use jetstream
* fix: improved docker build speed
* fix: remind manager via jetstream

PR 567 Commit bb0bd8e

Improvements to spaced-repetition screens

- Adding Notes header to spaced-repetition screens
- Using textarea that expand (#133)
- Input boxes for Add note span the width of the screen
- Clearer second action buton to return to View all notes (#222)
- On mobile you can tap to flip between note / flashcard on remind screen

PR 555 Commit 4bab553

- Moved changelog into hugo/assets/data
- Updated .gitignore
- Updated exclude list for syncing content via rsync

PR 553 Commit be85bc1

- Updated hugo to v0.124.0
- Moved all data into assets/data and using resources.Get (hugo)
- Static site generation is allowed to request more memory (#551, #455)
- Removing content from static site generation once built.

Resolves #551, #455

PR 552 Commit b4287e5

- Frontend support for pricing.html
- Only allow purchase of tier if not already in the userInfo tiers
- Running production on 1 pod for now
- Openapi updated for userInfo response to include tiers
- Patching tierInfo is now an object user.EventUserPreferencePatchTierInfo

Resolves #437

PR 502 Commit 076a719

Tidying the garden

- Using echo helper for testing endpionts
- Removing uuid.User
- Internally using UserUUID as a string

Resolves #532 and #507

PR 538 Commit 9cfbca4

- When purchasing a tier, the tier is added to the user info and the system is tier aware, for different functionality within the product
- Resolves Move all writing to userPreferences to event handler #515
- Fixes issues in rebuild handler crashing everytime we go in realtime
- Resolves SetDailySettings is missing service test #416
- Resolves On save display_name trigger an event in user_info PATCH #182
- Resolves Move from Unix to UnixMilli #520
- Resolves Replace funk.Contains( to use slices.Contains where possible #518
- Replacing string grant for ActionGrant
- Sent Correction events for missing display name change events
- Sent correction events for deleting users
- Reducing ingress looks up for shared domains when checking expiring ssl certificates
- Updated to go 1.21 and fixed code changes
- Updated dockerfile to alpine3.19
- Updated sqlite 3.45

PR 516 Commit 6dfd66a

- Usage stats add to userinfo endpoint. Will be used when we bring tiers online, it will help track free tier and when to trigger upgrade paths.
- Moved all tests to use ginkgo/v2.
- Improved testing of raw events with in memory sqlite and nats KeyValue

PR 509 Commit fe813f1

Improvements to user experience

- Add overtime allows the user to interact now
- Via a list, practice typing now works
- Better SEO on Integrated Read Write Repeat
- Changed a few more sentences referencing entry to reference note instead

Resolves #503

PR 504 Commit ad7c8c5

- Changed the frontpage to focus more on Notes and tools #487
- Added Mission statement (#473)
- Content can have custom h1 tag to help explain the page / screen / value.
- Content can customise metadata fields keywords, description and robot.
- Learnalist Notes replaces the "brain + muscle" and we use the logo from the app "Add Remind Repeat". 
- Toolbox overview page #486 
- Adding a list to Notes, has better support for adding per row. 
- Improved UX on tool "Read Write Repeat - integrated" (/toolbox/read-write-repeat-v2.html)

PR 492 Commit 5e8c427

Fixes issue where accessing jetstream.KeyValue store did not fail fatally when an error occurred, affecting main api and spaced repetition activity service.

Resolves #500.

PR 501 Commit 4456814

Improvements to payment + documentation

- Payment includes the same metadata in payment_intent as found in checkout session.  
- Improved developer documentation around working with slideshow creation locally.
- Experimental code to listen to changes to srs or lists and store the latest version in kv

PR 497 Commit 39e38e6

Adding tier concept to payments

- Added database debugging to the monitoring document
- New payment endpoint "/payments/tier/{tier}/stripedata " that given a tier returns prices
- Testing against sqlite now uses sqlite_master to clear up tables
- Upgraded stripe library to 76
- Webhook endpoint for stripe is specific now /payments/webhooks/stripe

Resolves #493

PR 494 Commit 61bfcd3

- Adding robots.txt
- Redirecting learnalist.com, www.learnalist.com and www.learnalist.net to learnalist.net
- All http redirected to https
- Moving from 308 to 301 to tame the robots when interacting with unjumble page

Resovles #489

PR 490 Commit d8cead2

- New endpont /spaced-repetition/stats/:uuid to provide stats related to interacting with spaced repetition
- Fixed issue where daily reminder was broken once daylight savings has finished.
- When a FCM token is no longer valid, event.MobileDeviceRemove event is triggered.
- Upgraded Nats to 2.10.1 and using creds on all services
- Upgraded Stan to 0.25.5
- Upgraded to golang 1.21
- Upgraded hugo to 0.119
- Upgraded sqlite to 3.43.1
- Upgraded openapitools/openapi-generator-cli to 7.1.0-SNAPSHOT
- Using golang slices for Contains
- NewEchoHTTPServer encapsulates server setup, making it slightly easier to reuse
- Moved from ioutil.ReadAll to io.ReadAll

PR 477 Commit 14ab9f0

When fcm token is expired or not valid, it only removes the mobile device with that token.

Resolves #475

PR 478 Commit ff0d0ac

Spaced Repetition Remind screen
- On flip, show the meaning
- "Practice Typing": Adding a button to give the user the ability to practice typing as a form of active learning, via practice and repetition 

Resolves #471

PR 472 Commit 4eaf1eb

- Removing login_redirect from the query string

Toolbox Plank Stats V2
- If logged in and plank stats shared, will show the link to share with people (#452)
- Stats Summary stands out more with a sublte background

Plank
- Fixed bug: If the user is logged in, the plank share settings will be used (#451)

Fixes #451, #452.
Removes the need for #464.

PR 470 Commit ccd5a59

Toolbox Read Write Repeat
Touching the screen when in typing mode will trigger the keyboard to appear on a mobile browser

PR 469 Commit 8ee150a

# What
- Metrics-server is now under kustomize (restarting k3s seems to bring back an older version)
- textarea + input now have a border again

Static Site
- compling refers to css not the framework

On spaced repetition overview
- you are now able to play unjumble from any item
- when deleting an entry, you will be asked to confirm
- viewing the json is now reachable by clicking a button
- you are able to practice typing from any item via Read Write Repeat

Toolbox Read Write Repeat
- The typing experince is better
- Typing works on mobile for both v1 and v2
- Accepts a query parameter practice to start typing

Toolbox Unjumble
- Pretty urls now redirect to /intro if not valid on the server side. Should fix issues with bots endlessly crawling the page

PR 468 Commit adf2bee

- Moving to openapi lib generated via javascript
- Using esbuild to build js + css for everything except the browser import and play
- tools.json comes from make-toolbox
- make-toolbox is source of truth for all spa and shared javascript.
- Moved from getApiServer -> getServer
- Using tailwind on the link component, to show it is possible

PR 445 Commit ea5cf5a

- On /toolbox/read-write-repeat-v2.html, link to the list being practiced
- Removed web component for the interact-menu, it is now part of the list type / kind entry file
- Removed interact menu from hugo

PR 438 Commit 2f9c9f8

- Export slideshow as a pdf, list kind v7
- Export slideshow as a video, list kind v8
- Fix getting user by token, if not found return not found
- Remove unused eventlogPubSubListener from event
- End to End tests support tls insecure
- Fix end to end log per, crashed if Do error'd
- Generating openapi yaml flie now uses docker
- System created list will silently fail if list fails to validate
- Moved a few things from the old k8s folder over into the kustomize base or production
- Updated go.mod

Resolves #406

PR 407 Commit 3339b4a

- e2e tests run much better against a cluster now
- GetUserUUIDByToken returns not found if record missing
- TriggeredBy is using const
- Replace ioutil -> io or os
- Static-site is its own deployment
- Static-site is using a queuedSubscriber now
- Static-site will trigger a hugo rebuild ever x milliseconds, disconnecting the writing of new records and building the site
- Removing ingress for lal01.learnalist.net
- Assets have their own endpoint to set max body
- Mimetype detection using lib as mp4 was not getting picked up

PR 417 Commit 86d63b8

- Updated golang to 1.20
- Updated go packages
- Updated alpine to 3.17
- Updated nats-streaming to 0.25.3
- Improved docs on end-to-end testing

PR 414 Commit f9bb17d

Better handling of when to dripfeed the next item in the list. The system is now aware of what item needs to be interacted with before triggering a new item to be added. This will result in not being fed too many new entries at once.

PR 396 Commit c305d64

- Frontend is using openapi with v4, for now
- Added kind when we create a list
- Added feedback on delete or reset spaced repetition item

PR 402 Commit 37836f0

Adding spaced repetition entry via dripfeed now sets created to be based on when the event happened.
Resolves #398.

PR 399 Commit 33799d2

- Linking from "My lists" (https://learnalist.net/my-lists.html) to Spaced repetition (https://learnalist.net/spaced-repetition.html)
- Able to delete an entry on https://learnalist.net/spaced-repetition.html
- Able to reset an entry for learning on https://learnalist.net/spaced-repetition.html
- List kind v2 now has a link to unjumble if interact is enabled

PR 397 Commit d4ea48c

- Updated openapi to match server changes to the delete space repetition entry which landed in #371.
- Updated openapi to match server for patching user info (landed via #170 and #140).
- Smoke tests for user use openapiv6 :).

PR 392 Commit 38e27ed

- Fixed bug in openapi clients, nesting the data structure
- Added optional hash field to the image item

Follow on from #368

PR 390 Commit 3e6645e

- Fixed signalling entry of V5 or V6 has been viewed (Resolves #387)
- Fixed an issue in practice list creation / update where v2 or v6 would not show the correct data if show = to

PR 388 Commit 1db9ee7

Supporting images in v1 and v2 lists

v1 with image = v5
v2 with image = v6

More detail

openapi
- Added v5 list type (Simple but with image data)
- Added v6 list type (FromTo but with image data)
- Added AlistItemMeta to openapi
- Added AlistItemEarthPosition to openapi
- Added kind to top level of alist, it will be set based on info.type
- Fixed openapi to support different list types based on the kind
- Fixed openapi to support different list item types in spaced repetition
- Creation of go code via v6 of [openapi generator](https://github.com/OpenAPITools/openapi-generator/)

e2e
- Added e2e client for openapiv6

server
- Delete plank returns 200 and a message
- Delete challenge returns 200 and a message
- Delete daily settings returns 200 and a message
- Fixed race condition in jqquery

Resolves #368

PR 371 Commit 1f52636

Upgrading go + docker + hugo 

- Upgrading to go 1.19
- Updating hugo to 0.105
- Updating alpine to 3.16 
- Using golang 1.19

PR 384 Commit 72ab70e

- Titles are wrapped in single quote to play nice with yaml
- Description is wrapped in single quote to play nice with yaml

Fixes #363

PR 366 Commit 24eb544

- my-lists.html will redirect to the users specific lists
- Via my-lists page it is now possible to filter the lists
- Via my-lists page you are now able to click to edit lists you have write or owner access to (#291)
- If no lists, present a nice call to action (#92)
- Adjusted the header of all templates to align the left and the right side

Resolves #92, #291.

PR 352 Commit 5be35c3

- /alists/* return no-cache
- /unjumble/* return no-cache
- Responding better to HEAD requests

Resolves #343 (Clicking on documents cause them to be cached and not re-evaluated)

PR 351 Commit 41f7ec9

- Fixed some warnings around not handling cancel in smoke tests
- Fixed warning in firefox to explicitly set the SameSite policy on the cookie

Resolves #319

PR 350 Commit 24e4c79

Via /api/v1/spaced-repetition/viewed it is now possible to change any item.
Resolves #347

PR 349 Commit edb8b14

- A command "tools massage alist-created" takes a particular input and produces a UPDATE sql command.

PR 348 Commit 6efe9e5

- When login via idp, if the redirect url is set, return them to that after login
Resolves #282

PR 344 Commit 79749fe

- Adding ingress, to pipe from production to local dev, mostly for working with login via google | login via apple
- Change golang config file via SERVER_CONFIG
- New make commands to run api-servier, hugo and javascript separately
- Document how to tunnel traffic from external cluster locally for development

PR 346 Commit c14993e

In the browser, we run javascript on an interval to make sure if the cookie expires we delete user info from local storage.

Resolves #271

PR 342 Commit dbaf618

- Endpoints are now using repeatable middleware instead of specific skip logic
- If cookie set and token is valid, we set-cookie with new expire time
- All set-cookie are using UTC
- Added smoke test for cookie setting
- Fixed smoke test for login to delete user
- Smoke Tests, all work when the host is not 127.0.0.1:1234 via LEARNALIST_SERVER.
- Making e2e tests work with local cluster and cookies
- /assets/ can be reached via the /api/v1/assets/ or via /assets/

Fixes #336

PR 340 Commit b8cf3a8

- When deleting a challenge, a new event is fired to the monolog.
- Added e2e test for deleting the challenge and confirming the event is written to the monolog and static site topic

Resolves #175

PR 339 Commit 6eac59c

- Fixed css and missing doctype on in frontpage layout
- Fixed css and missing doctype on in user list layout
- Fixed css and missing doctype on in public list layout
- Added link to setup k8s in the readme
- Support page now exists where a logged in user can give money to learnalist or buy access to create public lists (stripe integration, is online) (Resolves #236)

PR 249 Commit 5cd7ed8

- Adding resources (limit + cpu)
- Moving learnalist deployment into learnalist.yaml and using clusterip (turns out we had nodeport set)

By product of working on #236.

PR 333 Commit ba4df44

- Adding userinfo get response to openapi
- Making nats read able to follow the logs

PR 332 Commit bc64e20

- Fixed cmd/tools/integration-tests.go:75:2: fmt.Println arg list ends with redundant newline
- As a user I want the ability to restart the spaced learning for an item. Resolves #299.
  - Via spaced repetition viewed endpoint, we now support restart, signalling to restart the entry (uuid) spaced repetition journey from the beginning (level 0).
  - Via the web, clicking "sooner" now restarts the item for spaced learning.

PR 302 Commit 40c1d75

- Fix css purging to include :global
- Fix jq filtering to actually filter if the filter fails to match
- A custom router, to be sort of SPA but using pretty urls, something around # based, didn't sit well
- Interactive play, unjumble items in a list. Starting with list type v2.

PR 324 Commit 66a2a79

- Using the durable name in nats subscribe helper function, meaning stan is now keeping track of the durable instead of defaulting to latest events.
- Removing event reader from the cluster.

PR 330 Commit f70cfab

- Fix acl to include write access for creators (owners) of a list based on alist_kv.
- New event InputAclAlistAccess, to capture the concept it is an input, might be the start of more. But we shall see.

Resolves #326

PR 328 Commit ea97b99

- Mixing jq + sqlite to enhance searching of json objects, we register a custom_func allowing us to "jq_match" in sql to filter the object based on filters generated in the code or passed in via POST body.
- Added include_system_lists paramter to alist/by/me
- Added better handling of labels with spaces
- Added post endpoint to handle raw jq filters
- Better testing (unit + End to end) for /alist/by/me endpoint

PR 325 Commit 5d9a213

- "Just One thing", a very opinionated todo list, allowing for one current item and the ability to have a "current view", look in #308 for more.
- Fixed a url redirect in spaced repetition spa
- When lookinng up current user, if it fails for network reasons it does not clear the user session

PR 310 Commit 9c0ed86

- Possible to collaborate on a list, by giving someone write access
- Openapi documented share endpoints for request access
- Openapi documented share endpoints to grant / revoke access
- Able to grant or revoke write access to a list for a user
- Access view, is aware of read and write requests
- Improved test coverage around challenge endpoints
- When acl entries are written, we now include a created timestamp
- Via PUT, if the list is not found the model for saving will reject
- run-static-site is now linked to dev_external.config
- Fixed plank history not showing up in the browser

Resolves #320.

PR 321 Commit 7048d6c

Creating / updating the toolbox list, if the source file doesn't exist, it will create the directories and write an empty file (Fixes #296)

PR 309 Commit a262b18

- Update node modules in hugo
- Update node modules in js
- Fix broken test which came in via #301

PR 304 Commit a66b797

- updating nats image to nats:2.8.2-alpine3.15
- updating stan image to nats-streaming:0.24.6-alpine3.15
- learning I am using on the fly pvc, wanting to pin it in dev cluster so it is easy to find
- updating golang libraries for nats + stan
- When setting up ingress, we wait for it to be ready before finishing
- Upgrading hugo to 0.98
- e2e tests run in parallel

PR 301 Commit 6a564ca

Single page application to make it easy to import tabbed data, create a list and add for spaced learning.

PR 283 Commit edcb9e3

- Using alpine:3:15
- Pin hugo to v0.95.0 and downloading the binary from github

PR 295 Commit d308de1

- Frontpage has been re-worked to highlight the ios applications using learnalist.net
- Links to the ios applications are in the correct feature pages
- Update to use more recent version of sqlite, FOR IIF
- Fix bug, "rebuild-static-site" includes all users, not just users with a list.
- Restriction, creating a list only supports private if "public write access" has not been granted.
- On my lists page, include lists the user has read access to
- When list is shared with friends, the "no-access" has a call to action to request access if logged in
- my lists are now updated when user has been granted or revoked access to a list
- New, access overview page, currently scoped to lists and requests, to allow or deny access to list
- When requesting read access, it is possible to send the owner a special link for your single read request
- When deleting a list, if shared with friends, triggers an update to those users "my lists"

PR 288 Commit dd68d9b

Added created column to the alist_kv table, to make the system aware of when the list was first made.

Resovles #286

PR 290 Commit bf4a0ff

- As a developer, improved an issue around css not being copied over to hugo (https://github.com/thgh/rollup-plugin-css-only/issues/40)
- Fixed an inssue in the manifest-cleanup.sh where it was catching manifest keys when it was a substring of others.
- Via shared.js we now reuse the same getCurrentUser.
- Read Write Repeat Version 2 (lets build some muscle memory!)
Building from https://learnalist.net/toolbox/read-write-repeat-v1.html, I wanted to create a version that interacts a little tighter with the spaced repetition section of the website.

Via https://learnalist.net/toolbox/read-write-repeat-v2.html, same experiences a v1.
Via https://learnalist.net/toolbox/read-write-repeat-v2.html#todaysPracticeList, show your current practice list, generated from using our spaced repetition tools.
Via https://learnalist.net/toolbox/read-write-repeat-v2.html#personalSpacedRepetition, show your spaced repetition list and make it easier to pick from there to practice typing
Via a public list (ie https://learnalist.net/toolbox/read-write-repeat-v2.html#uuid/ad573393-4898-5c23-9781-3f0caafd7734), able to pick a row to practice typing.

PR 281 Commit f6534c7

> Build practice lists, based on clicking sooner in the remind app ("viewed + decr")

- remind service, now listens for spaced repetition viewed events to build practice lists based on when the user signals they want to be reminded later (action=decr).
- make build-mocks, no longer builds mocks for NatsSubscriber, I reference #265.
- "api service" / server, listens for system.list.save events and saves the list for the user and sets a flag to signify to the system it is created by the system and not the user
- list modification endpoints now reject if the system created the list.
- small test coverage improvment to github.com/freshteapot/learnalist-api/server/api/alist/sqlite

Resolves #276.

PR 277 Commit bbf13a5

- DailyReminder events now know about plank_v1 and send titles and messages reflective of the app, to inspire or encourage.
- GetReminders returns daily reminder settings based on user_id and app_identifier.
- If you change your daily settings, then the activity for the day, is lost (this could be fixed in another issue)
- Added logging around empty userUUID in the daily settings manager.

Fixes #239, at least on the server side.

PR 240 Commit aef4968

- Fixing links in the reference sectiton on the-humbe-plank landing page.
- Making it clear you need to be logged in, to see the plank stats via the website

PR 272 Commit c85fe29

- using go.1.17
- k3d v5 setting up k3s in docker
- kustomise for staging (k3d locally)
- Starting to kustomise for production
- A little db building, to use kustomize to bring the sql files to the cluster in configmap
- Nats with queuesubscribe (#266)
-- Support running multiple versions of the api-server, from a nats point of view. I word it like this, as the sqlite file and html files will only work if both servers have access to the same folder. (READ will still be a problem on a k8s with more than 1 node that doesnt support Read Write Many RWX)
-- Confirmed it worked, by running two api-servers and then the e2e-tests.
-- The e2e tests confirmed I had problems moving to QueueSubscriber, it feels pretty damn good to see this and then see it work.

Resolves #156 via #264

PR 262 Commit 2148b1b

- Support page for mobile humble plank app
- Support page for mobile remind app
- Better linking from welcome.html to the respective links above.
- Able to run make develop with LAL_INTERFACE, to make it easier to work on a mac when not on wifi, ie via mobile internet

Helps resolve #256

PR 261 Commit 9879cf8

- Adding link to Import and Play chrome extension
- Tidying up the top level readme

PR 248 Commit aa0b2fd

- Browser extension "Import and Play" tries to make a list out of the vocabulary section of skills on duolingo.com (#241)
- Server support for lists created with from.kind duolingo (#241)
- Added first version copy for the browser extension "Select and Save" / "Add to 🧠 + 💪"
- Add first version copy for the browser extension "Import and Play"
- Creating a first version of a privacy policy based on Legalmattic from Automattic
- share.js is only included if the template has js files to include

PR 242 Commit 57af0df

- Fix Granting or revoking users ability to create public lists via the command line (#230)
- Using event.TopicMonolog everywhere
- Improving the documentation around running e2e tests

PR 238 Commit caf3930

- Remove the "are you sure prompt" that is triggered before leaving the plank-stats-v1 page to login

PR 237 Commit ab8b666

- Streamlining the process of creating single page apps, under "toolbox".
- Adding language-pad to toolbox
- Adding read-write-repeat to toolbox
- Adding plank-stats to toolbox
- Adding css to plank
- Cleanup script to remove files that are not in the manifest_css.json or manifest_js.json on the server
- When leaving plank stats page, ensure we remove any notifications
- On visibility change we now use the same logic to filter checking for next spaced repetitions

PR 235 Commit 6511c76

- Fixed a bug that was sending daily reminders to the wrong users devices (#233).
- e2e test for the above issue, has shown me one way to hook into the log for more fine grained e2e testing.
- Static site file rebuild, now batches the requests to protect a little from event herding.

PR 234 Commit d6cb926

- Landing page for remind app.
- Landing page for humble plank app.
- Page for technical-changelog and documented how to update it.
- Samples are used in the hugo css build step to make sure we touch paths in different layouts.
- Added sync-content option to makefile.
- sync-site-assets will now rebuild js libraries from openapi before running.

PR 231 Commit 44c4ab6

- Update js dependencies in js and hugo
- manifest_js and manifest_css have a base that is now copied to hugo
- How we move js and css from js to hugo has changed a little

Fixes #224

PR 225 Commit 42e63a4

- Only able to publish public lists if you have write access (#214).
- Registering a new user allows for setting if they have write access for public lists (#214).
- Notifying hugo of changes via events (#207).
- Able to grant and revoke access to write public lists via the command line.
- Challenges now trigger events to hugo for updating (#198 #199)
- e2e openapi client records the requests, making it easier to see scope of coverage linked to the openapi document.

Resolves #214 #207 #199 #198

PR 215 Commit c3bf2fa

Handling when entry has reached the highest spaced learning level.
Fixes #218

PR 219 Commit e3ba219

- When saving a list from external source, we now check the suffix of the hostname for match.
- Import and play has its own Spaced Repetition UI, decoupled from the website.
- New extension to provide support for adding via context menu (works in both firefox and google out the box)

Resolves #139

PR 211 Commit 29e3a38

- Clicking "Add meaning / definition" toggles checkbox and expose meaning box.

Resolves #134

PR 209 Commit 1c81a6d

- Document how to use daily reminders api.
- Better searching on auto generated api index.

Resolves #200

PR 208 Commit e2b118e

- Login with appleID via web.
- Login with appleID via idp rest endpoint.
- Improved test coverage.
- Document how to update idps to the "learnalist user uuid".


Resolves #203

PR 204 Commit 05f0fec

- Add lists overtime for spaced repetition learning, via api and UI.
- Improve developer experience around restarting nats
- Fix issue where Rollback of transaction would have crashed due to tx being nil
- Only show spaced repetition if the list has entries.

Resolves #193

PR 194 Commit 6bd5346

- Fixes a crash in remind-manager. It was not running EVENTS = nats
- GetReinders now returns array of tokens not just the first token to send message to.

PR 196 Commit b719ec6

- Send a reminder to users with the mobile app. It is delayed by last_active, currently set to 5 minutes. Only sends once until further interaction from the user.
- Api endpoint for app-settings, allowing to opt in or opt out for spaced repetition notifications via push.
- A fix to remove a users spaced repetition entries when the user is deleted.
- Cruedly checking to see if hugo, npm, go, and yq are installed.
- Clicking on server information, returns the correct information.
- Bump version of Hugo to 0.80.0 (#188)

Resolves #188 #183

PR 184 Commit d062e8a

- Let two users add the same entry for spaced repetition learning.
- Improve test coverage of spaced_repetition pkg.
- e2e test to verify two users adding the same entry

Resolves #185.

PR 186 Commit 15e8b43

- Brings reminder engine to learnalist, the engine is location aware and hopefully delivers the reminders in the local time of the user.
- Decoupled the reminder engine, so it can be stand alone from the rest of the system.
- When registering mobile device, if "app + token" already exists, we remove the previous entry as it is now assumed to be a new user.

Helps bring #168 to life.

PR 170 Commit 414cdc3

- Restrict access to the /api/v1/user/register via header simple key
- Small improvements to the documentation

Resolves #153

PR 181 Commit e280411

- Via idp login, lookup google profile when registering new user.
- Bug in tools command, not using events.

PR 180 Commit 3bbb521

- Able to query challenges api and filter by kind.
- Added index on user_uuid to table acl_simple.

Resolves #169.

PR 179 Commit 1476631

Metadata work
- When list is public show description
- When list is public and has labels, add tags
- When list is not public tell the robots to ignore

PR 178 Commit 3021e62

- Challenge records only include users in the challenge.
- Challenge user list is based on acl, not if they have added a record.
- Hugo now also listens via events to write content (lal.staticSite).
- Hugo supports writing challenge pages when altered via the api.
- Able to add "content specific metadata" in hugo.
- Small start to cleaning up out of date documentation.

Resolves #172

PR 173 Commit 0049e8d

- Adding nats + stan k8s files for ops.
- Creating a short lived store for use with sending events for static site generation.
- ssl renewal works now, we will find out in March.

PR 174 Commit ff36aa7

- Registering mobile device with a token now supports adding app_identifier.
- Openapi reflects the new app_identifier attribute.

Resolves #162

PR 161 Commit cc44da7

* New api endpoint to allow login via idp_token.
* Push notifications service consuming nats stream.
* New api to register mobile device, linking token to user.
* Notifications for when a user joins, leaves or adds to a challenge.
* Updated slack-reader to handle the new events.
* Able to toggle spaced repetition with the spacebar.
* Building the api.overview file based on parsing the openapi document.

PR 155 Commit dd04e37

Short version:
- New api for plank recording and viewing history.
- New api for challenges.
- Able to create a "plank challenge".
- Able to give your user a display name via the api.

Longer version:
- Plank app has its own api now
- History via desc
- Adding logs to user delete
- Making it clear the test coverage dropped
- Copy data from lists to plank table
- Move planks to plank table and remove lists
- Fix lists with no shared settings and set to private
- Challenge system, allowing a user to create a challenge group for planking.
- Able to add display_name via register api.
- Able to add display_name via user/info api.

Solves #136.

PR 140 Commit f7c0535

- Closing nats connections.
- Simplified event system for nats and memory.
- Fixed an issue with "func init" and bindEnv in Viper.
- Added "logout" events.

PR 146 Commit dbde227

- Able to add an asset (very poormans cdn)
- Introducing an event bus to decouple when a user is deleted and removing assets.
- Requires manual update to the db (acl_simple).
- Small refactor on parsing in variables into InitApi.
- Adding iptables to k3s setup to block public access to kubectl.

PR 109 Commit 31ecb94

Improved spaced repetition
- Overview of entries.
- Stats of when entries were created.
- Able to add entry without going thru an existing list.

Plank
- History reports week better 

Resolves #125

PR 126 Commit a6682c2

* Moved openapi into own folder
* Able to generate full openapi from parts.
* Able to generate clients for, golang, typescript-fetch and dart.
* Cobbled some code together to extract the css class names used in svelte so hugo adds the missing ones from tachyons in base css.
* Spaced repetition gives the user chance to give feedback on sooner or later to remind of entry.

PR 115 Commit 0cfa9b0

* A plank recorder is born, record planks and view history.
* Plank recorder works for logged in and non logged in user, with call to action.
* Cleaned up editor code to use more of the website code base
* Using api generated by the openapi document
* Fixed missing css setup in many of the files
* Moved the header section of hugo into its own partial
* Moved hugo to a side car in kubernetes, speeding up rendering for the indvidual file as the files scale
* Sharing code logic for rollups.

PR 110 Commit d6503bb

* Add slideshow to list type V2
* Update docs on how to clean up ssh tunnels
* Sharing css via all.css in js world.

PR 104 Commit f4d2b6b

- Able to delete a user via the api.
- Cli tool to delete the user (via the server).
- fixed and documented https certificate, not using fullchain.
- Making it clearer where all the api httpXXX structs are.
- Improved more of the logging to log as json, including field "context.
- Upgraded to golang 1.14.3
- Upgraded to alpine 3.12
- Upgraded to hugo 0.72
- Via make it is now possible to run end to end tests locally

PR 94 Commit 6980615

- Fixes #91, a bug when first time login via google would result in the user not having a data json file of its lists, which would then cause "my lists" to show a 500 as there is no file on disk to render. 
- Added test coverage for the google oauth callback endpoint.
- Improved test coverage a little more.

PR 93 Commit fa65123

- List type v4 data is an array of objects with attributes content and url.
- Cleaned up code in package "alist", to follow naming conventions better.
- Return messages, refer generically to the documentation (which doesn't exist.. yet!).
- Added list type specific documentation.
- Added countries and months (under dataset) with a crude covert script (integrations/convert).

PR 51 Commit f5924fe

* Fixes #47, make sure the user is lowercase.
* User endpoint returns the uuid and the username.
* Better validation on both username and password.

PR 49 Commit d20eaa4

* Acl in use on list creation, editing and viewing.
* Acl support via casbin, saved to the database.
* /share/alist endpoint to grant or revoke access to a list.
* /alist/:uuid checks to see if you are allowed to read the list.
* Does require database update before launch.
* Fixes #45.

PR 46 Commit e546136

- Filter a list via labels, list type and labels and list type, fixes #39.
- Documented the new query parameters.

PR 41 Commit 4142f86

- When using PUT or DELETE, it now checks the request User is the same as the list user.
- Added api test for version.
- Reduced duplication in the tests.
- MustExec, will cause a panic, removed some and documented the non-test example.

PR 36 Commit 0a98b55

* Removing a label will remove it from the list as well.
* Added the integration script to cleanup current data related to removing of labels.

PR 31 Commit cb0fc65

When a user is created it returns a 201.
When a user is created with the same username and password it returns a 200.
When a user is created with a username in the system it returns a 400.

PR 32 Commit 4a7d1e2

- Removing a list will make sure the user who created is the only one who can delete it (Fixed #25).
- Posting a list will return a 201, updating = 200 (Fixed #23).

PR 26 Commit 8d0ba06

- Updated the api readmer to reflect the current state of the api endpoints.
- The system is aware of labels now (#19).
- When querying for the users lists, it is now possible to filter the results based on labels (#19).
- PUT now creates lists that do not exist (#20)
- Slowly improving the tests.

PR 24 Commit d4cd119