Skip to content

Releases: j33f/TasksPipes

TasksPipes 0.10.0

Choose a tag to compare

@j33f j33f released this 18 Oct 20:56
Immutable release. Only release title and notes can be modified.

Instance settings in the administration, merged in #30.

Features

  • Instance settings in the administration (#29): a new Settings tab, applied at once without a restart:

    • SMTP, with a test e-mail;
    • Outline on or off, its servers and API key sign-in;
    • Outline OAuth;
    • sign-up and invitations by e-mail, with the allowed e-mail domains;
    • company sign-in (OIDC).

    Also a History of changes tab.

Upgrading

  • Database: two new tables, instance_settings and instance_settings_history, created at start, nothing removed.
  • Environment variables:
    • a variable that is set (and not empty) locks its setting in the interface. Leave out, or empty, the variables you want to manage in the app (see docs/HOSTING.md);
    • in particular, check the defaults passed by your compose file (ALLOW_API_KEY_LOGIN: …:-true, SMTP_PORT: …:-587…).
  • New optional variables: OUTLINE_ENABLED, EMAIL_DOMAINS.

Full changelog: v0.9.0...v0.10.0

TasksPipes 0.9.0

Choose a tag to compare

@j33f j33f released this 18 Oct 19:45
Immutable release. Only release title and notes can be modified.

Features 2 to 16 of the roadmap since v0.8.0, merged in #16.

Changelog

Features

  • Global search (#9):
    • finds every task you can see, in all pipes and incoming buckets: title, description, sub-tasks, field values, linked document, comments, or number (TP-123);
    • PostgreSQL full text, accents ignored, French and English stemming;
    • from the sidebar or with Ctrl/⌘ + K, filtered by status, owner and task type;
    • access rules are applied in the SQL query itself, and confidential tasks show no excerpt.
  • Outline colleagues take part once signed in (#10):
    • workspace members who never signed in get no task, ownership, team membership or e-mail;
    • they can be invited instead, by e-mail or with a link to copy when the instance sends no e-mail.
  • Instance administration and GDPR (#11):
    • administrators named by ADMIN_EMAILS see every account and can disable or enable one;
    • Outline sessions are checked hourly and closed when Outline revokes access;
    • data export (a zip of data.json plus the tasks' files);
    • account deletion for e-mail accounts, confirmed by a two-factor code or a link sent by e-mail. The history is kept under "Deleted account", and teams the person alone administered get their oldest other member as admin.
  • Export and import of tasks (#12):
    • a pipe's tasks export as CSV or JSON, with the fields of their task types;
    • CSV import with column matching and a preview, and Trello board import;
    • every line is checked first, and nothing is imported while one is wrong.
  • Public API and webhooks (#13):
    • personal access tokens: read or read-write, expiring, stored hashed;
    • /api/v1, documented in OpenAPI with Swagger UI at /api/v1/docs;
    • outgoing webhooks per pipe: signed with HMAC-SHA256, retried with growing delays, and logged.
  • Recurring tasks (#14):
    • every n days, chosen weekdays, a day of the month, the first, n-th or last weekday, the last business day, or every year;
    • at fixed dates, made on the date or some days ahead, or once the previous task is done;
    • never made twice.
  • @mentions (#15):
    • in comments, descriptions and refusal reasons, suggesting only people who can open the task;
    • the person is notified live in the app, and by e-mail only if they are not online.
  • Dependencies between tasks (#17, #19):
    • a task can wait for any other task its editor can open, across spaces; loops are refused;
    • the task shows "Blocked", is left out of Next action, and moving it forward asks for confirmation;
    • when the last blocker is finished, the owner and author are notified, in the app and by e-mail;
    • a linked task one cannot open shows only its title and owner, or nothing at all if it is confidential or team-only.
  • Task types of incoming tasks (#18):
    • a task sent to someone's incoming only offers the types of the recipient's open pipes;
    • a task's type can be changed when it is accepted or moved into a pipe.
  • Labels and priority (#20):
    • a priority for every task (urgent, high, medium, low), and labels per space;
    • filters in pipes, My tasks and the search, and My tasks grouped by priority;
    • the user stories' Priority field is migrated once into the new priority.
  • Calendar view (#21): month and week views of due dates, with drag and drop to change a date, under the same rule as editing it.
  • WIP limits and swimlanes (#22):
    • a work-in-progress limit per column, set in the pipe type editor, warns once exceeded;
    • the board can be split into swimlanes by owner or by task type.
  • Estimates and logged time (#23):
    • an estimate per task, and time logged by hand, up to 90 days back;
    • the total is shown against the estimate;
    • logged time counts in the weekly report and in exports.
  • Installable app and push notifications (#25):
    • a manifest and a service worker, which caches only the interface, never any data;
    • Web Push on devices, sent while the person is not in the app, encrypted per RFC 8291 and signed with VAPID using node:crypto only.
  • Slack, Mattermost and Teams (#26): a pipe's webhooks can post short messages to a channel, in the webhook's language.
  • Company sign-in with OpenID Connect (#27):
    • any provider, authorization code flow with PKCE, and the ID token checked against the provider's keys;
    • an e-mail account is linked only when the provider vouches for the address;
    • optional allowed domains, and turned off with OIDC_ENABLED=false.
  • One file per language, and Spanish (#28):
    • each language is one file, locales/<code>.json, and adding one needs no code change;
    • Spanish is complete.

Fixes

  • Webhooks (#15): a delivery written just before a sending pass could wait for the next one (database and app clocks).
  • Tests:
    • a webhook test's pattern was much weaker than meant (CodeQL, #26);
    • the daily digest test failed when run in the evening (#28).
  • Documentation: the note under the rate-limit table of HOSTING.md rendered as a table row.

CI

  • CI and CodeQL also run on dev and on pull requests targeting it (#8).

Upgrading

  • Database: the schema is updated at start, idempotently, with nothing removed.

    • New tables:
      • task_search, api_tokens, pipe_webhooks, webhook_deliveries, task_recurrences;
      • task_dependencies, space_labels, task_labels, task_time_entries, push_subscriptions, schema_steps.
    • New columns on users, tasks, notifications and pipe_webhooks.
    • CHECK constraints: some are wider; the one on users.locale is dropped, and the app now checks the language instead.
    • On the first start, existing tasks are indexed for the search, and the user stories' priority is copied once.
  • PostgreSQL extensions: with a database of your own, the account must be allowed to create unaccent, as it already must for pgcrypto.

  • Language files: the locales/ folder at the root of the repository must ship with the app. The Dockerfile copies it; LOCALES_DIR can point elsewhere.

  • New optional environment variables, documented in docs/HOSTING.md and .env.example:

    • ADMIN_EMAILS;
    • WEBHOOK_ALLOW_PRIVATE;
    • VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT;
    • OIDC_ISSUER, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_NAME, OIDC_SCOPES, OIDC_ALLOWED_DOMAINS, OIDC_ENABLED;
    • LOCALES_DIR.

    DEFAULT_LOCALE now accepts any language that has a file.

  • Behaviour changes:

    • Outline members who never signed in can no longer be sent tasks, assigned, or added to teams, and get no e-mail;
    • accounts that never signed in get no notification or report e-mail;
    • a task sent to someone's incoming must have a type offered by their open pipes, or the plain Task type;
    • the user stories' Priority field is replaced by the priority every task now has.
  • New dependencies (server, official Fastify plugins): @fastify/swagger@9.9.2 and @fastify/swagger-ui@6.1.2. Web Push and OIDC use no dependency.

  • Code scanning: the server-side request forgery alert on user-chosen URLs is closed as won't fix (#23, #25).

  • GitGuardian: incident 38362696 concerns the public test values of RFC 8291, in a commit of #24 that was closed and replaced by #25. Mark it as a false positive.

Not yet tried in real conditions

  • Push notifications on real devices: Chrome, Firefox, and Safari on iOS (installed app).
  • Slack, Mattermost and Teams channels with real incoming webhooks.
  • OIDC against a real provider (Keycloak, Okta or Entra ID).
  • Spanish: to be reviewed by a native speaker.

Known limitations

  • "Online" is known per app instance: with several instances, someone connected to another instance still gets the e-mail for a mention or an unblocked task.
  • Spanish search uses the English configuration: there is no Spanish stemming yet.
  • OIDC colleagues do not see each other automatically: they connect through invitations, like e-mail accounts.
  • Pipe import does not read priority, labels or logged time.

Full changelog: v0.8.0...v0.9.0