Skip to content

Instantly share code, notes, and snippets.

@gwpl
Last active February 11, 2026 17:21
Show Gist options
  • Select an option

  • Save gwpl/9586e2e97ec8689fb77c150c2d711a5b to your computer and use it in GitHub Desktop.

Select an option

Save gwpl/9586e2e97ec8689fb77c150c2d711a5b to your computer and use it in GitHub Desktop.
Todoist td cli tool simple measurements, comment for improvements welcome (request for better --verbose debugging output : https://github.com/Doist/todoist-cli/issues/40 )
#!/bin/bash
# request for better --verbose debugging output : https://github.com/Doist/todoist-cli/issues/40
set -x
set -x
date; time td today | wc -l
date; time td today --all | wc -l
date; time td today --ndjson | wc -l
date ; time td today --ndjson --all | wc -l

Todoist CLI Performance Analysis - Verbose Output 260211

Source: https://gist.github.com/gwpl/9586e2e97ec8689fb77c150c2d711a5b PR: Doist/todoist-cli#56 Issue: Doist/todoist-cli#40 Support Ticket: #916983

Smoking Gun Analysis

Based on the verbose output with -vvvv tracing, here's what's actually causing the latency:

1. API Response Times (Server-Side)

GET /api/v1/projects - THE PRIMARY BOTTLENECK

  • 2.7-3.2 seconds consistently across all test runs:
    • Test 1: 2698ms
    • Test 2: 3181ms
    • Test 3: 2871ms
    • Test 4: 2710ms
  • Returns only 50 projects with has_more=true (pagination available but not fetched)
  • This is pure server response time - consistently the slowest endpoint
  • No obvious reason for 3-second response time for 50 JSON objects

GET /api/v1/tasks/filter (today | overdue)

  • 1.2-1.6 seconds per request:
    • Test 1: 1598ms
    • Test 2: 1272ms
    • Test 3: 1371ms
    • Test 4: 1373ms
  • Returns 87 tasks with has_more=false (complete in one request)
  • Second-worst performance

GET /api/v1/user

  • 250ms-1.4s (highly variable):
    • Test 1: 390ms
    • Test 2: 256ms
    • Test 3: 1412ms
    • Test 4: 364ms
    • Outliers: 1412ms, 1477ms
  • Smallest payload, but still has unpredictable outliers

2. Node.js Startup Overhead

Looking at the wall-clock timestamps vs. first log line:

  • ~11-17 seconds from process start until first log line appears:
    • Test 1: Started 18:04:10, first log 17:04:22 = 12s offset
    • Test 2: Started 18:06:16, first log 17:06:27 = 11s offset
    • Test 3: Started 18:06:33, first log 17:06:48 = 15s offset
    • Test 4: Started 18:06:56, first log 17:07:13 = 17s offset

This is NOT API latency - this is Node.js/TypeScript initialization overhead before the CLI even starts running.

3. CloudFront Cache Misses

Every single request shows: x-cache=Miss from cloudfront

  • No caching benefits
  • All requests hitting origin servers
  • CloudFront POP: ZRH52-P1 (Zurich)
  • CDN is configured but not providing any acceleration

Summary: The Smoking Gun

Primary Culprit: /api/v1/projects endpoint - 2.7-3.2s server response time

This is a server-side performance issue, not a network or client issue:

  • Consistently slow across all 4 test runs
  • Returns only 50 projects (partial response requiring pagination)
  • No obvious reason for 3-second response time for 50 JSON objects
  • This accounts for ~17-19% of total wall-clock time

Secondary Issue: Node.js startup overhead - 11-17s before CLI begins

This explains why the support ticket shows 11-20s for simple commands:

  • Most of that time is process startup, not API calls
  • TypeScript/bundled code initialization
  • This accounts for ~48-74% of total wall-clock time

Contributing Factor: CloudFront cache misses

Not the root cause, but contributing to latency:

  • No CloudFront caching means every request hits origin
  • Could potentially save 100-500ms per request with proper cache headers
  • CDN is in place but not being utilized

Timing Breakdown

Total wall-clock times:

  • Test 1 (td today -vvvv): 17.957s
  • Test 2 (td today --all -vvvv): 16.856s
  • Test 3 (td today --ndjson -vvvv): 22.500s
  • Test 4 (td today --ndjson --all -vvvv): 22.827s

Approximate breakdown for Test 1 (17.957s):

  • Node.js startup: ~12s (67%)
  • API - projects: ~2.7s (15%)
  • API - tasks: ~1.6s (9%)
  • API - user: ~0.4s (2%)
  • CLI processing: ~1.3s (7%)

Recommendations

  1. Server-side: Investigate /api/v1/projects endpoint performance

    • 3 seconds for 50 projects suggests database query optimization needed
    • Consider pagination strategy (why not return all user projects in one request?)
  2. Client-side: Reduce Node.js startup overhead

    • Consider bundling/tree-shaking optimizations
    • Lazy-load dependencies
    • Pre-compile TypeScript or use faster runtime
  3. CDN: Enable CloudFront caching for GET requests

    • User data can be cached with short TTL (30-60s)
    • Would benefit repeated commands in quick succession
  4. Architecture: Consider caching layer

    • Local cache for projects/user data (rarely changes)
    • Could eliminate 3-4 seconds on subsequent runs
# Verbose benchmark of td today commands using --verbose (-vvvv) from:
# PR: https://github.com/Doist/todoist-cli/pull/56
# Commit: https://github.com/VariousForks/todoist-cli-by-Doist-fork/commit/31976d1f7136ec3fa94fe92cb528b1238b208038
# Date: 2026-02-11
# Branch: i40-verbose-trace-output
#
# This output is safe to share publicly - no private task/project data is included.
# All verbose output goes to stderr with [td:info/detail/debug/trace] prefixes.
#
# Original timing benchmark (without verbose): https://gist.github.com/gwpl/9586e2e97ec8689fb77c150c2d711a5b
========================================
=== TEST 1: td today -vvvv ===
Started: 2026-02-11T18:04:10+01:00
========================================
[td:info] 2026-02-11T17:04:22.036Z verbose logging enabled (level=4)
[td:detail] 2026-02-11T17:04:22.057Z initializing TodoistApi client
[td:detail] 2026-02-11T17:04:22.057Z TodoistApi client ready
[td:detail] 2026-02-11T17:04:22.058Z paginate started | limit=300 perPage=200
[td:detail] 2026-02-11T17:04:22.058Z paginate page 1 | page_size=200 cursor=(initial) accumulated=0
[td:info] 2026-02-11T17:04:22.522Z fetch GET /api/v1/tasks/filter
[td:detail] 2026-02-11T17:04:22.523Z fetch GET https://api.todoist.com/api/v1/tasks/filter?query=today+%7C+overdue&limit=200
[td:trace] 2026-02-11T17:04:22.523Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:04:24.121Z fetch GET /api/v1/tasks/filter => 200 | duration_ms=1598
[td:trace] 2026-02-11T17:04:24.126Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:04:24 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 2df3825a2dc874fe2f6a21536c6d8f72.cloudfront.net (CloudFront) x-amz-cf-id=rzJ4YmCSYFSeKBtiK_UzT5peoxUENKwJXtdOpf2B9bWc9z3Oacfzhw== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:detail] 2026-02-11T17:04:24.340Z paginate page 1 done | results=87 has_more=false duration_ms=2281
[td:detail] 2026-02-11T17:04:24.351Z paginate complete | total_results=87 pages_fetched=1 has_more=false
[td:info] 2026-02-11T17:04:24.352Z api.getUser()
[td:info] 2026-02-11T17:04:24.356Z fetch GET /api/v1/user
[td:detail] 2026-02-11T17:04:24.356Z fetch GET https://api.todoist.com/api/v1/user
[td:trace] 2026-02-11T17:04:24.356Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:04:24.746Z fetch GET /api/v1/user => 200 | duration_ms=390
[td:trace] 2026-02-11T17:04:24.746Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:04:24 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 3e12e656267276c5b1cf72e129a2193e.cloudfront.net (CloudFront) x-amz-cf-id=xxZctUn6Aj_8J8Lofhf5MYegtEm_HaBDNwBG5HVTzCKCHMeTmLklrA== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront x-frame-options=SAMEORIGIN
[td:info] 2026-02-11T17:04:24.756Z api.getUser() response | duration_ms=404 id=50297
[td:info] 2026-02-11T17:04:24.757Z api.getProjects()
[td:info] 2026-02-11T17:04:24.757Z fetch GET /api/v1/projects
[td:detail] 2026-02-11T17:04:24.757Z fetch GET https://api.todoist.com/api/v1/projects
[td:trace] 2026-02-11T17:04:24.757Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:04:27.455Z fetch GET /api/v1/projects => 200 | duration_ms=2698
[td:trace] 2026-02-11T17:04:27.456Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:04:27 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 1b07bab32e93e81199e0f74a9ca61e6a.cloudfront.net (CloudFront) x-amz-cf-id=1o709JeewXI4sm9NYvCv-LO3Ty5UpTzxmbVTaK-RJgZLnCYCAs0pBw== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:info] 2026-02-11T17:04:27.561Z api.getProjects() response | duration_ms=2804 result_count=50 has_more=true next_cursor=qjIyMTU5NDA3Nzc.2xIxr2KRBZMoFEbv
real 0m17.957s
user 0m5.272s
sys 0m0.477s
========================================
=== TEST 2: td today --all -vvvv ===
Started: 2026-02-11T18:06:16+01:00
========================================
[td:info] 2026-02-11T17:06:27.476Z verbose logging enabled (level=4)
[td:detail] 2026-02-11T17:06:27.481Z initializing TodoistApi client
[td:detail] 2026-02-11T17:06:27.482Z TodoistApi client ready
[td:detail] 2026-02-11T17:06:27.483Z paginate started | limit=9007199254740991 perPage=200
[td:detail] 2026-02-11T17:06:27.483Z paginate page 1 | page_size=200 cursor=(initial) accumulated=0
[td:info] 2026-02-11T17:06:27.653Z fetch GET /api/v1/tasks/filter
[td:detail] 2026-02-11T17:06:27.654Z fetch GET https://api.todoist.com/api/v1/tasks/filter?query=today+%7C+overdue&limit=200
[td:trace] 2026-02-11T17:06:27.654Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:06:28.926Z fetch GET /api/v1/tasks/filter => 200 | duration_ms=1272
[td:trace] 2026-02-11T17:06:28.928Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:06:28 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 3e12e656267276c5b1cf72e129a2193e.cloudfront.net (CloudFront) x-amz-cf-id=ihmdC9VNlggcLRZB1jmlIBVwkS3O2Wlz0pkT5div4zeVsNfgbCaa4g== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:detail] 2026-02-11T17:06:29.038Z paginate page 1 done | results=87 has_more=false duration_ms=1554
[td:detail] 2026-02-11T17:06:29.038Z paginate complete | total_results=87 pages_fetched=1 has_more=false
[td:info] 2026-02-11T17:06:29.044Z api.getUser()
[td:info] 2026-02-11T17:06:29.045Z fetch GET /api/v1/user
[td:detail] 2026-02-11T17:06:29.045Z fetch GET https://api.todoist.com/api/v1/user
[td:trace] 2026-02-11T17:06:29.045Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:06:29.302Z fetch GET /api/v1/user => 200 | duration_ms=256
[td:trace] 2026-02-11T17:06:29.302Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:06:29 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 4c908c441c16c2ae0f60f3480e16d480.cloudfront.net (CloudFront) x-amz-cf-id=4oazqRWPeiqBK9R9eqpDuZSDkbDF09bKqJVkGLFJXp3CdOHO6F0a-A== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront x-frame-options=SAMEORIGIN
[td:info] 2026-02-11T17:06:29.359Z api.getUser() response | duration_ms=315 id=50297
[td:info] 2026-02-11T17:06:29.360Z api.getProjects()
[td:info] 2026-02-11T17:06:29.377Z fetch GET /api/v1/projects
[td:detail] 2026-02-11T17:06:29.377Z fetch GET https://api.todoist.com/api/v1/projects
[td:trace] 2026-02-11T17:06:29.377Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:06:32.559Z fetch GET /api/v1/projects => 200 | duration_ms=3181
[td:trace] 2026-02-11T17:06:32.559Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:06:32 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 b4404a488b0bf1e6ad3743f3e240e538.cloudfront.net (CloudFront) x-amz-cf-id=X0ZVCwDT9Q-3CWpQuVp0CAJW1smHJ_p3mg8fdMeVJQCTP4usMHqHMQ== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:info] 2026-02-11T17:06:32.775Z api.getProjects() response | duration_ms=3416 result_count=50 has_more=true next_cursor=qjIyMTU5NDA3Nzc.2xIxr2KRBZMoFEbv
real 0m16.856s
user 0m5.332s
sys 0m0.522s
========================================
=== TEST 3: td today --ndjson -vvvv ===
Started: 2026-02-11T18:06:33+01:00
========================================
[td:info] 2026-02-11T17:06:48.675Z verbose logging enabled (level=4)
[td:detail] 2026-02-11T17:06:48.863Z initializing TodoistApi client
[td:detail] 2026-02-11T17:06:48.864Z TodoistApi client ready
[td:detail] 2026-02-11T17:06:48.864Z paginate started | limit=300 perPage=200
[td:detail] 2026-02-11T17:06:48.865Z paginate page 1 | page_size=200 cursor=(initial) accumulated=0
[td:info] 2026-02-11T17:06:49.361Z fetch GET /api/v1/tasks/filter
[td:detail] 2026-02-11T17:06:49.362Z fetch GET https://api.todoist.com/api/v1/tasks/filter?query=today+%7C+overdue&limit=200
[td:trace] 2026-02-11T17:06:49.362Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:06:50.732Z fetch GET /api/v1/tasks/filter => 200 | duration_ms=1371
[td:trace] 2026-02-11T17:06:50.816Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:06:50 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 fff826c4760294142d4ae4bea736a00c.cloudfront.net (CloudFront) x-amz-cf-id=HPfFEcvL_RYX3NH7WXFzSXTvaU0Cb7K9awv7osWzj27rrbuGa3uvvg== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:detail] 2026-02-11T17:06:51.402Z paginate page 1 done | results=87 has_more=false duration_ms=2537
[td:detail] 2026-02-11T17:06:51.412Z paginate complete | total_results=87 pages_fetched=1 has_more=false
[td:info] 2026-02-11T17:06:51.414Z api.getUser()
[td:info] 2026-02-11T17:06:51.415Z fetch GET /api/v1/user
[td:detail] 2026-02-11T17:06:51.415Z fetch GET https://api.todoist.com/api/v1/user
[td:trace] 2026-02-11T17:06:51.415Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:06:52.827Z fetch GET /api/v1/user => 200 | duration_ms=1412
[td:trace] 2026-02-11T17:06:52.831Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:06:52 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 63981dc5d36196bc20dc32938804362e.cloudfront.net (CloudFront) x-amz-cf-id=ebO7vxhAJ40KAChEXYIi0EgQXxbL-2LPOsz8ugAikS8i9VZqaHvBvA== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront x-frame-options=SAMEORIGIN
[td:info] 2026-02-11T17:06:52.899Z api.getUser() response | duration_ms=1477 id=50297
[td:info] 2026-02-11T17:06:52.900Z api.getProjects()
[td:info] 2026-02-11T17:06:52.900Z fetch GET /api/v1/projects
[td:detail] 2026-02-11T17:06:52.900Z fetch GET https://api.todoist.com/api/v1/projects
[td:trace] 2026-02-11T17:06:52.900Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:06:55.771Z fetch GET /api/v1/projects => 200 | duration_ms=2871
[td:trace] 2026-02-11T17:06:55.771Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:06:55 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 4c908c441c16c2ae0f60f3480e16d480.cloudfront.net (CloudFront) x-amz-cf-id=7Eo85Xxf4IIr3W4OWMLGYZSAWV9b74jW5Wcskd2DqPfYnR-Kme0KVw== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:info] 2026-02-11T17:06:55.925Z api.getProjects() response | duration_ms=3025 result_count=50 has_more=true next_cursor=qjIyMTU5NDA3Nzc.2xIxr2KRBZMoFEbv
real 0m22.500s
user 0m5.108s
sys 0m0.546s
========================================
=== TEST 4: td today --ndjson --all -vvvv ===
Started: 2026-02-11T18:06:56+01:00
========================================
[td:info] 2026-02-11T17:07:13.211Z verbose logging enabled (level=4)
[td:detail] 2026-02-11T17:07:13.400Z initializing TodoistApi client
[td:detail] 2026-02-11T17:07:13.401Z TodoistApi client ready
[td:detail] 2026-02-11T17:07:13.406Z paginate started | limit=9007199254740991 perPage=200
[td:detail] 2026-02-11T17:07:13.406Z paginate page 1 | page_size=200 cursor=(initial) accumulated=0
[td:info] 2026-02-11T17:07:13.794Z fetch GET /api/v1/tasks/filter
[td:detail] 2026-02-11T17:07:13.795Z fetch GET https://api.todoist.com/api/v1/tasks/filter?query=today+%7C+overdue&limit=200
[td:trace] 2026-02-11T17:07:13.795Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:07:15.168Z fetch GET /api/v1/tasks/filter => 200 | duration_ms=1373
[td:trace] 2026-02-11T17:07:15.176Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:07:15 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 2fea9bb55456bdcc8f2da3765c8fd6ea.cloudfront.net (CloudFront) x-amz-cf-id=MlAS9wvJ3HN5pljuGf759At6P_D9bSRdMcwTd0bNY_H2-lQqgw289g== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:detail] 2026-02-11T17:07:15.561Z paginate page 1 done | results=87 has_more=false duration_ms=2145
[td:detail] 2026-02-11T17:07:15.561Z paginate complete | total_results=87 pages_fetched=1 has_more=false
[td:info] 2026-02-11T17:07:15.569Z api.getUser()
[td:info] 2026-02-11T17:07:15.572Z fetch GET /api/v1/user
[td:detail] 2026-02-11T17:07:15.572Z fetch GET https://api.todoist.com/api/v1/user
[td:trace] 2026-02-11T17:07:15.572Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:07:15.935Z fetch GET /api/v1/user => 200 | duration_ms=364
[td:trace] 2026-02-11T17:07:15.936Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:07:15 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 fff826c4760294142d4ae4bea736a00c.cloudfront.net (CloudFront) x-amz-cf-id=_f8VKjJt_OKi0udTwLfpy87bocm3wfQPDECw4e47x9Kt7B__XqEmUg== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront x-frame-options=SAMEORIGIN
[td:info] 2026-02-11T17:07:15.964Z api.getUser() response | duration_ms=393 id=50297
[td:info] 2026-02-11T17:07:15.964Z api.getProjects()
[td:info] 2026-02-11T17:07:15.965Z fetch GET /api/v1/projects
[td:detail] 2026-02-11T17:07:15.965Z fetch GET https://api.todoist.com/api/v1/projects
[td:trace] 2026-02-11T17:07:15.965Z request headers | Content-Type=application/json Authorization=[REDACTED]
[td:info] 2026-02-11T17:07:18.676Z fetch GET /api/v1/projects => 200 | duration_ms=2710
[td:trace] 2026-02-11T17:07:18.676Z all response headers | alt-svc=h3=":443"; ma=86400 connection=keep-alive content-encoding=gzip content-type=application/json date=Wed, 11 Feb 2026 17:07:18 GMT referrer-policy=strict-origin-when-cross-origin server=gunicorn strict-transport-security=max-age=31536000; includeSubDomains; preload transfer-encoding=chunked vary=Accept-Encoding via=1.1 e88b7159f8022f6a253ca0d3e23a4574.cloudfront.net (CloudFront) x-amz-cf-id=luRP34XAG_OOZCkGsXVe8C0LnbVbMEgDPEY8qRBEfB1O8Y_whq1yIQ== x-amz-cf-pop=ZRH52-P1 x-cache=Miss from cloudfront
[td:info] 2026-02-11T17:07:18.746Z api.getProjects() response | duration_ms=2782 result_count=50 has_more=true next_cursor=qjIyMTU5NDA3Nzc.2xIxr2KRBZMoFEbv
real 0m22.827s
user 0m5.150s
sys 0m0.493s
$ date; time td today | wc -l
2026-02-06T08:36:18 CET
7
real 0m11.021s
user 0m1.139s
sys 0m0.110s
$ date; time td today --all | wc -l
2026-02-06T08:43:47 CET
192
real 1m50.154s
user 0m2.692s
sys 0m0.192s
$ date; time td today --ndjson | wc -l
2026-02-06T08:49:50 CET
2
real 0m10.472s
user 0m1.382s
sys 0m0.160s
$ date ; time td today --ndjson --all | wc -l
2026-02-06T08:50:00 CET
63
real 1m36.632s
user 0m3.126s
sys 0m0.308s
+ set -x
+ date
2026-02-10T20:46:07 CET
+ td today
+ wc -l
10
real 0m11.144s
user 0m1.446s
sys 0m0.143s
+ date
2026-02-10T20:46:18 CET
+ td today --all
+ wc -l
258
real 1m55.790s
user 0m3.239s
sys 0m0.232s
+ date
2026-02-10T20:48:14 CET
+ td today --ndjson
+ wc -l
3
real 0m11.157s
user 0m1.427s
sys 0m0.158s
+ date
2026-02-10T20:48:25 CET
+ td today --ndjson --all
+ wc -l
85
real 1m55.622s
user 0m3.365s
sys 0m0.291s
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment