Announcing trellang 1.0.0: A Trello REST client for Erlang/OTP
Update: now 1.1.0 (19/09/2025)
Trellang is an Erlang/OTP Trello client focused on standard libraries and clear docs. On 11 September 2025 we released trellang 1.0.0 to Hex. The follow-up 1.1.0 refines configuration guidance and examples while keeping the library small and dependency free.
INFO
trellang 1.1.0 is out. We’ve expanded the Configuration docs below and updated the install snippet. Full list of changes: see the CHANGELOG.
- Hex package: trellang on Hex
- Docs: HexDocs for trellang
- Source: GitHub: stritzinger/trellang
Why trellang?
- OTP-native: Uses Erlang’s standard libraries (
inets/httpc,public_key,ssl, OTP 27json) — zero external JSON deps. - Board-agnostic API: IDs are parameters; the client works across multiple boards concurrently.
- Resilient HTTP: Retries with backoff and jitter on 429/5xx.
- TDD’d and documented: Common Test suites and OTP 27 docs with ExDoc.
Highlights
- Cards: Create, read, update core fields (
name,desc,due,pos). - Labels & members: Look up by color and username, add to cards ergonomically.
- Custom fields: List board custom fields and set text/date/checkbox values on cards.
- Discovery: List lists on a board; dump board structure (board → lists → cards).
- TLS/SNI: Correct certificate validation and SNI handling built-in.
Install
Add trellang to your rebar.config:
{deps, [
{trellang, "1.1.0"}
]}.Configuration
Trellang reads your Trello credentials from the Erlang application environment. Required keys:
trellang.trello_keytrellang.trello_token
Recommended: keep credentials in a non-committed dev.config and run with ERL_FLAGS (see docs/dev.config.example in the repo).
Minimal dev.config example:
[
{trellang, [
{trello_key, "..."},
{trello_token, "..."}
]}
].Run with the config file:
ERL_FLAGS="-config ./dev.config" rebar3 ctYou can also set the values at runtime before the first API call, even after the application is started:
application:set_env(trellang, trello_key, "...").
application:set_env(trellang, trello_token, "...").
{ok, Me} = trello:me().Run
- Compile:
rebar3 compile - General docs:
rebar3 ex_doc(output indoc/, git-ignored)
Quick start
Provide your Trello key/token via an Erlang config (e.g. dev.config) and run with ERL_FLAGS="-config ./dev.config".
Find your board short link in the URL after /b/ (e.g., <<"abcd1234">>), then discover a list and create a card:
BoardId = <<"abcd1234">>,
{ok, Lists} = trello:list_lists(BoardId),
ListId = maps:get(<<"id">>, hd(Lists)),
{ok, Card} = trello:create_card(ListId, #{name => <<"Hello Trello">>}),
CardId = maps:get(<<"id">>, Card),
{ok, _} = trello:set_desc(CardId, <<"Created from Erlang">>),
{ok, _} = trello:add_label_by_color(BoardId, CardId, <<"green">>),
{ok, Card2} = trello:get_card(CardId).Set a custom field (text):
{ok, Fields} = trello:list_custom_fields(BoardId),
TextId = maps:get(<<"id">>, hd([F || F <- Fields, maps:get(<<"type">>, F) =:= <<"text">>])),
{ok, _} = trello:set_custom_field_text(CardId, TextId, <<"hello-cf">>).Dump the board:
{ok, Dump} = trello:dump_board(BoardId, #{}).Design choices
- Built-in JSON only: OTP 27
jsonfor consistent, dependency-free encoding/decoding. - No global board coupling: Only
trello_keyandtrello_tokenare read from the application env; all other identifiers are passed in. - Fail-fast APIs: Operations expect valid credentials; errors are surfaced clearly.
Roadmap
- Pagination helpers for list-heavy endpoints
- More ergonomic finders (labels, members, lists)
- Additional endpoints as demand grows
