
harbouR is an unofficial R client for working with
SeaTable data from R — either from a local
.dtable file, with no server involved at all, or from a
self-hosted SeaTable server over its REST API. Results come back as
tidy tibbles through a column-type-aware coercion layer that makes a
base feel like a set of data frames.
harbouR is written for people who run their own SeaTable Server, or who
simply have an exported .dtable file and want to analyse it. The two
paths share one vocabulary: hb_list_tables(), hb_read_table() and
friends work the same whether the base is a file on disk or a server you
administer.
SeaTable is a trademark of SeaTable GmbH; this package is not affiliated with or endorsed by SeaTable GmbH.
# install.packages("pak")
# pak::pak("CTTIR/harbouR")
install.packages("harbouR", repos = c('https://cttir.r-universe.dev', 'https://cloud.r-project.org'))
library(harbouR)
client <- hb_client(
server = Sys.getenv("SEATABLE_SERVER"),
api_token = Sys.getenv("SEATABLE_API_TOKEN")
)
hb_list_tables(client)
samples <- hb_read_table(client, "Samples")
samples |>
dplyr::filter(.data$Status == "ready") |>
dplyr::arrange(.data$Collected)
The bundled example data let you explore the data model fully offline before connecting a server: Writing to a base, SQL and file uploads need a server.
library(harbouR)
meta <- hb_example_metadata()
tibble::as_tibble(meta)
#> # A tibble: 2 × 3
#> name n_columns n_views
#> <chr> <int> <int>
#> 1 Samples 7 1
#> 2 Patients 4 1
hb_example_rows("Samples")
#> # A tibble: 3 × 8
#> Name Concentration Status Tags Collected Collaborators Reports
#> <chr> <dbl> <chr> <list> <dttm> <list> <list>
#> 1 S-001 12.4 draft <chr> 2026-04-01 09:00:00 <chr [1]> <list>
#> 2 S-002 8.1 ready <chr> 2026-04-03 12:30:00 <chr [2]> <list>
#> 3 S-003 21 shipped <chr> 2026-04-05 16:15:00 <chr [0]> <list>
#> # ℹ 1 more variable: `_id` <chr>
harbouR reads and writes SeaTable’s own .dtable export, so an analysis
can run with no server at all. The same verbs work either way:
path <- system.file("extdata", "example.dtable", package = "harbouR")
base <- hb_read_dtable(path)
hb_list_tables(base)
#> # A tibble: 2 × 4
#> name n_rows n_columns n_views
#> <chr> <int> <int> <int>
#> 1 Samples 2 27 1
#> 2 Reference 2 2 1
hb_read_table(base, "Samples")[, 1:4]
#> # A tibble: 2 × 4
#> Name Notes Concentration Share
#> <chr> <chr> <dbl> <dbl>
#> 1 S-001 A plain **markdown** string. 0.000587 0.42
#> 2 S-002 Rendered elsewhere. 8.1 NA
Writing one back preserves its base content and available extracted
attachments. Missing attachments or symbolic links left out of an export
produce a warning. hb_dtable() builds a base out of ordinary data
frames so you can import R results into SeaTable:
# extract the assets, so the attachments are written back too
base <- hb_read_dtable(path, assets = "extract")
hb_write_dtable(base, "my-base.dtable")
hb_dtable(Measurements = my_data) |>
hb_write_dtable("for-seatable.dtable")
hb_run_explorer() launches a Shiny app for inspecting any base
interactively, with a demo mode that needs no credentials.
harbouR covers the parts of the SeaTable API you need to get data in and out: authentication, metadata, rows, tables, columns, views and files. Not yet wrapped, in rough order of intent:
Earlier releases exported these as stubs that raised “not yet implemented”. They no longer exist: a function you can call is a promise that it works. Track progress or request one at https://github.com/CTTIR/harbouR/issues.
If harbouR contributes to work you publish, please cite it. The entry is generated from the package metadata, so it always matches the version you have installed:
citation("harbouR")
#> To cite harbouR in publications, please use:
#>
#> Heller R, Elsinghorst P, Derz W, Ring M, Achatz G, Forstmeier V
#> (2026). _harbouR: R Client for SeaTable Collaborative Databases_. R
#> package version 0.1.0, <https://github.com/CTTIR/harbouR>.
#>
#> A BibTeX entry for LaTeX users is
#>
#> @Manual{,
#> title = {{harbouR}: R Client for {SeaTable} Collaborative Databases},
#> author = {Raban Heller and Paul Elsinghorst and Wiebke Derz and Matthias Ring and Gerhard Achatz and Vinzent Forstmeier},
#> year = {2026},
#> note = {R package version 0.1.0},
#> url = {https://github.com/CTTIR/harbouR},
#> }
harbouR is by Raban Heller, Paul Elsinghorst, Wiebke Derz, Matthias Ring, Gerhard Achatz and Vinzent Forstmeier. It grew out of their needs, field testing and data.
harbouR is written for two things:
.dtable export
directly, with no server involved at all.That is the intended scope, and it is what the documentation, examples
and tests describe. hb_client() takes a server URL as an argument and
makes no judgement about which host you give it; this is a statement of
what the package is built and documented for, not a technical
restriction.
harbouR is an independent, third-party client. It is not affiliated with, endorsed by, sponsored by, or officially connected to SeaTable GmbH. Please raise anything about harbouR here, not with SeaTable GmbH.
SeaTable is a trademark of SeaTable GmbH, 117er Ehrenhof 5, 55118 Mainz, Germany (Amtsgericht Mainz, HRB 49723). harbouR uses the name only to identify the service it talks to, claims no right in the mark, and ships none of SeaTable GmbH’s logos or brand assets — the harbouR logo is an original work.
harbouR contains no SeaTable server code. It communicates with a SeaTable server through the public REST API that SeaTable GmbH documents for third-party applications. Your use of SeaTable itself is governed by your agreement with SeaTable GmbH, not by this package’s licence, and harbouR is provided without warranty (see LICENSE).
The full notice is in NOTICE.md.
harbouR is a client. Everything it does rests on work SeaTable GmbH and Seafile Ltd. did first, and on a series of decisions they made about how open that work would be.
/dtable-server and /dtable-db
were deprecated in 5.2 and removed in 5.3, with dates. harbouR was
aimed at exactly those endpoints. Without that changelog this package
would still be talking to an API that no longer exists — not a
hypothetical benefit.dtable-sdk and the HTML-page SDK; the
n8n nodes are MIT. The community forum has a Developer Talk category
for API questions.To be accurate rather than flattering: SeaTable Server is not open
source — the component holding the tables, dtable-server, is
proprietary. What carries a recognised open licence are the official
client libraries and SDKs (Apache-2.0) and the n8n nodes (MIT).
The OpenAPI specification and the reference are published publicly and readable without registration, but they carry no open licence — and harbouR does not rely on one. It reproduces no documentation prose; what it uses are endpoint paths, verbs and JSON field names, and it relies on Article 1(2) of Directive 2009/24/EC, under which the ideas and principles underlying a program’s interfaces are not protected by copyright (CJEU, SAS Institute v World Programming, C-406/10; § 69a(2) UrhG in Germany). SeaTable’s own dtable-server EULA points the same way: it defines applications talking to the Server over its API as “third-party software” and states that “[t]he provisions of the EULA do not apply to any such third-party software”(source).
This is the reasoning harbouR’s authors relied on, with sources named so it can be checked. It is not legal advice and was not written by a lawyer. The full notice, including the limits on that reasoning, is in NOTICE.md.
SeaTable is developed by Seafile Ltd. (Beijing), which grew it out of the Seafile project; SeaTable GmbH (Mainz), founded in July 2020 by Dr. Ralf Dyllick-Brenzinger and Christoph Dyllick-Brenzinger, is the German company behind it. Thanks are owed to both. If SeaTable is useful to you, support them at https://seatable.com/.
Where applicable, LLM tools were used for narrowly defined, non-authorial tasks: copyediting, prose refinement, Markdown/LaTeX formatting, boilerplate scaffolding (such as CI configurations and build scripts), and code refactoring. Tools included Chat AI, the KISSKI (GWDG) service, and self-hosted Mistral Small (24B, Apache-2.0) served through a local vLLM architecture on an Ubuntu Linux workstation with Intel processors and NVIDIA GPUs. The self-hosted model ran locally, with no data sent to third parties.
All scientific claims, methodological choices, analyses, interpretations and conclusions remain the authors' own. Where applicable, LLM-generated material must be reviewed and revised before inclusion, and references must be verified against their DOI, arXiv ID or ISBN.
Local software setup: vLLM with Python/PyTorch, plus R and RStudio.
Editable R artwork and regeneration instructions are in tools/branding.