webtrackr

:telescope: R package for Preprocessing and Analyzing Web Tracking Data

https://github.com/gesistsa/webtrackr

Science Score: 57.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 2 DOI reference(s) in README
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (18.1%) to scientific vocabulary

Keywords

r-package rstats-package webtracking
Last synced: 10 months ago · JSON representation ·

Repository

:telescope: R package for Preprocessing and Analyzing Web Tracking Data

Basic Info
Statistics
  • Stars: 9
  • Watchers: 3
  • Forks: 3
  • Open Issues: 4
  • Releases: 3
Topics
r-package rstats-package webtracking
Created almost 4 years ago · Last pushed 10 months ago
Metadata Files
Readme Changelog License Citation

README.Rmd

---
output: github_document
---



```{r, include = FALSE}
knitr::opts_chunk$set(
    collapse = TRUE,
    comment = "#>",
    fig.path = "man/figures/README-",
    out.width = "100%"
)
```

# webtrackR 


[![CRAN status](https://www.r-pkg.org/badges/version/webtrackR)](https://CRAN.R-project.org/package=webtrackR)
[![CRAN Downloads](https://cranlogs.r-pkg.org/badges/webtrackR)](https://CRAN.R-project.org/package=webtrackR)
[![R-CMD-check](https://github.com/schochastics/webtrackR/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/schochastics/webtrackR/actions/workflows/R-CMD-check.yaml)
[![Codecov test coverage](https://codecov.io/gh/schochastics/webtrackR/branch/main/graph/badge.svg)](https://app.codecov.io/gh/schochastics/webtrackR?branch=main)


webtrackR is an R package to preprocess and analyze web tracking data, i.e., 
web browsing histories of participants in an academic study. Web tracking data is 
oftentimes collected and analyzed in conjunction with survey data of the same participants.  

`webtrackR` is part of a series of R packages to analyse webtracking data:

- [webtrackR](https://github.com/schochastics/webtrackR): preprocess raw webtracking data
- [domainator](https://github.com/schochastics/domainator): classify domains
- [adaR](https://github.com/gesistsa/adaR): parse urls

## Installation

You can install the development version of webtrackR from [GitHub](https://github.com/) with:

``` r
# install.packages("devtools")
devtools::install_github("schochastics/webtrackR")
```

The [CRAN](https://CRAN.R-project.org/package=webtrackR) version can be installed with:
```r
install.packages("webtrackR")
```
## S3 class `wt_dt`

The package defines an S3 class called `wt_dt` which inherits most of the functionality from the `data.frame` class. A `summary` and `print` method are included in the package.

Each row in a web tracking data set represents a visit. Raw data need to have at least the following variables:

- `panelist_id`: the individual from which the data was collected
- `url`: the URL of the visit
- `timestamp`: the time of the URL visit

The function `as.wt_dt` assigns the class `wt_dt` to a raw web tracking data set. 
It also allows you to specify the name of the raw variables corresponding to `panelist_id`, `url` and `timestamp`. 
Additionally, it turns the timestamp variable into `POSIXct` format.

All preprocessing functions check if these three variables are present. Otherwise an error is thrown.

## Preprocessing

Several other variables can be derived from the raw data with the following functions:

- `add_duration()` adds a variable called `duration` based on the sequence of timestamps. The basic logic is that the duration of a visit is set to the time difference to the subsequent visit, unless this difference exceeds a certain value (defined by argument `cutoff`), in which case the duration will be replaced by `NA` or some user-defined value (defined by `replace_by`). 
- `add_session()` adds a variable called `session`, which groups subsequent visits into a session until the difference to the next visit exceeds a certain value (defined by `cutoff`). 
- `extract_host()`, `extract_domain()`, `extract_path()` extracts the host, domain and path of the raw URL and adds variables named accordingly. See function descriptions for definitions of these terms. `drop_query()` lets you drop the query and fragment components of the raw URL.
- `add_next_visit()` and `add_previous_visit()` adds the previous or the next URL, domain, or host (defined by `level`) as a new variable.
- `add_referral()` adds a new variable indicating whether a visit was referred by a social media platform. Follows the logic of Schmidt et al., [(2023)](https://doi.org/10.31235/osf.io/cks68).
- `add_title()` downloads the title of a website (the text within the `` tag of a web site's `<head>`) and adds it as a new variable.
- `add_panelist_data()`. Joins a data set containing information about participants such as a survey.

## Classification

- `classify_visits()` categorizes website visits by either extracting the URL's domain or host and matching them to a list of domains or hosts, or by matching a list of regular expressions against the visit URL.

## Summarizing and aggregating

- `deduplicate()` flags or drops (as defined by argument `method`) consecutive visits to the same URL within a user-defined time frame (as set by argument `within`). Alternatively to dropping or flagging visits, the function aggregates the durations of such duplicate visits.
- `sum_visits()` and `sum_durations()` aggregate the number or the durations of visits, by participant and by a time period (as set by argument `timeframe`). Optionally, the function aggregates the number / duration of visits to a certain class of visits.
- `sum_activity()` counts the number of active time periods (defined by `timeframe`) by participant.

## Example code

A typical workflow including preprocessing, classifying and aggregating web tracking data looks like this (using the in-built example data):

``` r
library(webtrackR)

# load example data and turn it into wt_dt
data("testdt_tracking")
wt <- as.wt_dt(testdt_tracking)

# add duration
wt <- add_duration(wt)

# extract domains
wt <- extract_domain(wt)

# drop duplicates (consecutive visits to the same URL within one second)
wt <- deduplicate(wt, within = 1, method = "drop")

# load example domain classification and classify domains
data("domain_list")
wt <- classify_visits(wt, classes = domain_list, match_by = "domain")

# load example survey data and join with web tracking data
data("testdt_survey_w")
wt <- add_panelist_data(wt, testdt_survey_w)

# aggregate number of visits by day and panelist, and by domain class
wt_summ <- sum_visits(wt, timeframe = "date", visit_class = "type")
```

</pre>
      </div>
  
      <div class="mb-4">
    <h3 class="mb-3">
        <a class="text-decoration-none" href="/hosts/GitHub/owners/gesistsa">Owner</a>
    </h3>

    <div class="card border-0 shadow-sm">
      <div class="card-body">
        <div class="row g-3">
          <div class="col-md-6">
            <ul class="list-unstyled mb-0">
                <li class="mb-2">
                  <strong>Name:</strong> Transparent Social Analytics
                </li>
                <li class="mb-2">
                  <strong>Login:</strong> gesistsa
                </li>
                <li class="mb-2">
                  <strong>Kind:</strong> <span class="badge rounded-pill bg-primary">organization</span>
                </li>
                <li class="mb-2">
                  <strong>Location:</strong> Germany
                </li>
            </ul>
          </div>

          <div class="col-md-6">
            <ul class="list-unstyled mb-0">
                <li class="mb-2">
                  <strong>Repositories:</strong> 2
                </li>
                <li class="mb-2">
                  <strong>Profile:</strong> <a class="text-decoration-none" href="https://github.com/gesistsa">https://github.com/gesistsa</a>
                </li>
            </ul>
          </div>
        </div>

          <div class="mt-3 pt-3 border-top">
            <p class="text-muted mb-0">Open Science Tools maintained by Transparent Social Analytics Team, GESIS</p>
          </div>
      </div>
    </div>
  </div>

    
      <div class="mb-4">
    <h3 class="mb-3">
      Citation
      <small class="text-muted">
        (<a target="_blank" class="text-decoration-none" href="https://github.com/gesistsa/webtrackR/blob/main/CITATION.cff">CITATION.cff</a>)
      </small>
    </h3>
    <div class="card border-0 shadow-sm">
      <div class="card-body">
        <pre class="mb-0"># --------------------------------------------
# CITATION file created with {cffr} R package
# See also: https://docs.ropensci.org/cffr/
# --------------------------------------------
 
cff-version: 1.2.0
message: 'To cite package "webtrackR" in publications use:'
type: software
license: MIT
title: 'webtrackR: Preprocessing and Analyzing Web Tracking Data'
version: 0.3.1.9000
identifiers:
- type: doi
  value: 10.32614/CRAN.package.webtrackR
abstract: Data structures and methods to work with web tracking data. The functions
  cover data preprocessing steps, enriching web tracking data with external information
  and methods for the analysis of digital behavior as used in several academic papers
  (e.g., Clemm von Hohenberg et al., 2023 <https://doi.org/10.17605/OSF.IO/M3U9P>;
  Stier et al., 2022 <https://doi.org/10.1017/S0003055421001222>).
authors:
- family-names: Schoch
  given-names: David
  email: david@schochastics.net
  orcid: https://orcid.org/0000-0003-2952-4812
- family-names: Hohenberg
  given-names: Bernhard
  name-particle: Clemm von
  email: bernhard.clemm@gesis.org
  orcid: https://orcid.org/0000-0002-6976-9745
- family-names: Mangold
  given-names: Frank
  email: frank.mangold@gesis.org
  orcid: https://orcid.org/0000-0002-9776-3113
- family-names: Stier
  given-names: Sebastian
  email: sebastian.stier@gesis.org
  orcid: https://orcid.org/0000-0002-1217-5778
preferred-citation:
  type: manual
  title: 'webtrackR: Preprocessing and Analyzing Web Tracking Data'
  authors:
  - family-names: Schoch
    given-names: David
    email: david@schochastics.net
    orcid: https://orcid.org/0000-0003-2952-4812
  - family-names: Hohenberg
    given-names: Bernhard Clemm
    name-particle: von
  - family-names: Mangold
    given-names: Frank
    email: frank.mangold@gesis.org
    orcid: https://orcid.org/0000-0002-9776-3113
  - family-names: Stier
    given-names: Sebastian
    email: sebastian.stier@gesis.org
    orcid: https://orcid.org/0000-0002-1217-5778
  year: '2023'
repository: https://CRAN.R-project.org/package=webtrackR
repository-code: https://github.com/gesistsa/webtrackR
url: https://github.com/gesistsa/webtrackR
contact:
- family-names: Schoch
  given-names: David
  email: david@schochastics.net
  orcid: https://orcid.org/0000-0003-2952-4812
keywords:
- r-package
- rstats-package
- webtracking
references:
- type: software
  title: 'R: A Language and Environment for Statistical Computing'
  notes: Depends
  url: https://www.R-project.org/
  authors:
  - name: R Core Team
  institution:
    name: R Foundation for Statistical Computing
    address: Vienna, Austria
  year: '2024'
  version: '>= 3.5.0'
- type: software
  title: utils
  abstract: 'R: A Language and Environment for Statistical Computing'
  notes: Imports
  authors:
  - name: R Core Team
  institution:
    name: R Foundation for Statistical Computing
    address: Vienna, Austria
  year: '2024'
- type: software
  title: stats
  abstract: 'R: A Language and Environment for Statistical Computing'
  notes: Imports
  authors:
  - name: R Core Team
  institution:
    name: R Foundation for Statistical Computing
    address: Vienna, Austria
  year: '2024'
- type: software
  title: httr
  abstract: 'httr: Tools for Working with URLs and HTTP'
  notes: Imports
  url: https://httr.r-lib.org/
  repository: https://CRAN.R-project.org/package=httr
  authors:
  - family-names: Wickham
    given-names: Hadley
    email: hadley@posit.co
  year: '2024'
  doi: 10.32614/CRAN.package.httr
- type: software
  title: data.table
  abstract: 'data.table: Extension of `data.frame`'
  notes: Imports
  url: https://r-datatable.com
  repository: https://CRAN.R-project.org/package=data.table
  authors:
  - family-names: Barrett
    given-names: Tyson
    email: t.barrett88@gmail.com
    orcid: https://orcid.org/0000-0002-2137-1391
  - family-names: Dowle
    given-names: Matt
    email: mattjdowle@gmail.com
  - family-names: Srinivasan
    given-names: Arun
    email: asrini@pm.me
  - family-names: Gorecki
    given-names: Jan
  - family-names: Chirico
    given-names: Michael
    orcid: https://orcid.org/0000-0003-0787-087X
  - family-names: Hocking
    given-names: Toby
    orcid: https://orcid.org/0000-0002-3146-0865
  - family-names: Schwendinger
    given-names: Benjamin
    orcid: https://orcid.org/0000-0003-3315-8114
  year: '2024'
  doi: 10.32614/CRAN.package.data.table
  version: '>= 1.15.0'
- type: software
  title: knitr
  abstract: 'knitr: A General-Purpose Package for Dynamic Report Generation in R'
  notes: Suggests
  url: https://yihui.org/knitr/
  repository: https://CRAN.R-project.org/package=knitr
  authors:
  - family-names: Xie
    given-names: Yihui
    email: xie@yihui.name
    orcid: https://orcid.org/0000-0003-0645-5666
  year: '2024'
  doi: 10.32614/CRAN.package.knitr
- type: software
  title: rmarkdown
  abstract: 'rmarkdown: Dynamic Documents for R'
  notes: Suggests
  url: https://pkgs.rstudio.com/rmarkdown/
  repository: https://CRAN.R-project.org/package=rmarkdown
  authors:
  - family-names: Allaire
    given-names: JJ
    email: jj@posit.co
  - family-names: Xie
    given-names: Yihui
    email: xie@yihui.name
    orcid: https://orcid.org/0000-0003-0645-5666
  - family-names: Dervieux
    given-names: Christophe
    email: cderv@posit.co
    orcid: https://orcid.org/0000-0003-4474-2498
  - family-names: McPherson
    given-names: Jonathan
    email: jonathan@posit.co
  - family-names: Luraschi
    given-names: Javier
  - family-names: Ushey
    given-names: Kevin
    email: kevin@posit.co
  - family-names: Atkins
    given-names: Aron
    email: aron@posit.co
  - family-names: Wickham
    given-names: Hadley
    email: hadley@posit.co
  - family-names: Cheng
    given-names: Joe
    email: joe@posit.co
  - family-names: Chang
    given-names: Winston
    email: winston@posit.co
  - family-names: Iannone
    given-names: Richard
    email: rich@posit.co
    orcid: https://orcid.org/0000-0003-3925-190X
  year: '2024'
  doi: 10.32614/CRAN.package.rmarkdown
- type: software
  title: testthat
  abstract: 'testthat: Unit Testing for R'
  notes: Suggests
  url: https://testthat.r-lib.org
  repository: https://CRAN.R-project.org/package=testthat
  authors:
  - family-names: Wickham
    given-names: Hadley
    email: hadley@posit.co
  year: '2024'
  doi: 10.32614/CRAN.package.testthat
  version: '>= 3.0.0'

</pre>
      </div>
    </div>
  </div>

    
    
    
      <div class="mb-4">
    <h3 class="mb-3">GitHub Events</h3>

    <div class="card border-0 shadow-sm">
      <div class="card-body">
        <div class="row g-4">
          <div class="col-md-6">
            <h6 class="text-muted text-uppercase small mb-3">Total</h6>
            <ul class="list-unstyled mb-0">
                <li class="mb-2">
                  <strong>Delete event:</strong> 2
                </li>
                <li class="mb-2">
                  <strong>Issue comment event:</strong> 1
                </li>
                <li class="mb-2">
                  <strong>Push event:</strong> 5
                </li>
                <li class="mb-2">
                  <strong>Pull request review event:</strong> 1
                </li>
                <li class="mb-2">
                  <strong>Pull request event:</strong> 7
                </li>
                <li class="mb-2">
                  <strong>Create event:</strong> 1
                </li>
            </ul>
          </div>

          <div class="col-md-6">
            <h6 class="text-muted text-uppercase small mb-3">Last Year</h6>
            <ul class="list-unstyled mb-0">
                <li class="mb-2">
                  <strong>Delete event:</strong> 2
                </li>
                <li class="mb-2">
                  <strong>Issue comment event:</strong> 1
                </li>
                <li class="mb-2">
                  <strong>Push event:</strong> 5
                </li>
                <li class="mb-2">
                  <strong>Pull request review event:</strong> 1
                </li>
                <li class="mb-2">
                  <strong>Pull request event:</strong> 7
                </li>
                <li class="mb-2">
                  <strong>Create event:</strong> 1
                </li>
            </ul>
          </div>
        </div>
      </div>
    </div>
  </div>

    
      <div class="mb-4">
    <h3 class="mb-3">
      <a target="_blank" class="text-decoration-none" href="https://issues.ecosyste.ms/repositories/lookup?url=https://github.com/gesistsa/webtrackr">Issues and Pull Requests</a>
    </h3>

      <p class="text-muted mb-3">
        <small>Last synced: over 1 year ago</small>
      </p>

      <div class="card border-0 shadow-sm mb-3">
        <div class="card-body">
          <div class="row g-4">
            <div class="col-md-6">
              <h6 class="text-muted text-uppercase small mb-3">All Time</h6>
              <ul class="list-unstyled mb-0">
                <li class="mb-2">
                  <strong>Total issues:</strong> 58
                </li>
                <li class="mb-2">
                  <strong>Total pull requests:</strong> 42
                </li>
                <li class="mb-2">
                  <strong>Average time to close issues:</strong> about 1 month
                </li>
                <li class="mb-2">
                  <strong>Average time to close pull requests:</strong> 2 days
                </li>
                <li class="mb-2">
                  <strong>Total issue authors:</strong> 4
                </li>
                <li class="mb-2">
                  <strong>Total pull request authors:</strong> 3
                </li>
                <li class="mb-2">
                  <strong>Average comments per issue:</strong> 1.34
                </li>
                <li class="mb-2">
                  <strong>Average comments per pull request:</strong> 0.0
                </li>
                <li class="mb-2">
                  <strong>Merged pull requests:</strong> 41
                </li>
                <li class="mb-2">
                  <strong>Bot issues:</strong> 0
                </li>
                <li class="mb-2">
                  <strong>Bot pull requests:</strong> 0
                </li>
              </ul>
            </div>

            <div class="col-md-6">
              <h6 class="text-muted text-uppercase small mb-3">Past Year</h6>
              <ul class="list-unstyled mb-0">
                <li class="mb-2">
                  <strong>Issues:</strong> 5
                </li>
                <li class="mb-2">
                  <strong>Pull requests:</strong> 3
                </li>
                <li class="mb-2">
                  <strong>Average time to close issues:</strong> about 2 months
                </li>
                <li class="mb-2">
                  <strong>Average time to close pull requests:</strong> 3 minutes
                </li>
                <li class="mb-2">
                  <strong>Issue authors:</strong> 4
                </li>
                <li class="mb-2">
                  <strong>Pull request authors:</strong> 1
                </li>
                <li class="mb-2">
                  <strong>Average comments per issue:</strong> 3.2
                </li>
                <li class="mb-2">
                  <strong>Average comments per pull request:</strong> 0.0
                </li>
                <li class="mb-2">
                  <strong>Merged pull requests:</strong> 3
                </li>
                <li class="mb-2">
                  <strong>Bot issues:</strong> 0
                </li>
                <li class="mb-2">
                  <strong>Bot pull requests:</strong> 0
                </li>
              </ul>
            </div>
          </div>

          <div class="mt-3 pt-3 border-top">
            <small class="text-muted">
              <a target="_blank" class="text-decoration-none" href="https://issues.ecosyste.ms/repositories/lookup?url=https://github.com/gesistsa/webtrackr">View more stats</a>
            </small>
          </div>
        </div>
      </div>

      <div class="card border-0 shadow-sm mb-3">
        <div class="card-header bg-white border-bottom">
          <h6 class="mb-0">Top Authors</h6>
        </div>
        <div class="card-body">
          <div class="row g-4">
            <div class="col-md-6">
              <h6 class="text-muted text-uppercase small mb-3">Issue Authors</h6>
              <ul class="list-unstyled mb-0">
                  <li class="mb-2">
                    <strong>sebstier</strong>
                    <small class="text-muted ms-2">(1)</small>
                  </li>
              </ul>
            </div>
            <div class="col-md-6">
              <h6 class="text-muted text-uppercase small mb-3">Pull Request Authors</h6>
              <ul class="list-unstyled mb-0">
                  <li class="mb-2">
                    <strong>chainsawriot</strong>
                    <small class="text-muted ms-2">(2)</small>
                  </li>
                  <li class="mb-2">
                    <strong>ArthurMuehl</strong>
                    <small class="text-muted ms-2">(2)</small>
                  </li>
                  <li class="mb-2">
                    <strong>schochastics</strong>
                    <small class="text-muted ms-2">(2)</small>
                  </li>
              </ul>
            </div>
          </div>
        </div>
      </div>

      <div class="card border-0 shadow-sm">
        <div class="card-header bg-white border-bottom">
          <h6 class="mb-0">Top Labels</h6>
        </div>
        <div class="card-body">
          <div class="row g-4">
            <div class="col-md-6">
              <h6 class="text-muted text-uppercase small mb-3">Issue Labels</h6>
              <div class="d-flex flex-wrap gap-2">
              </div>
            </div>
            <div class="col-md-6">
              <h6 class="text-muted text-uppercase small mb-3">Pull Request Labels</h6>
              <div class="d-flex flex-wrap gap-2">
              </div>
            </div>
          </div>
        </div>
      </div>
  </div>

    
      <hr/>
  <h2>Dependencies</h2>

    <div class="card mb-3">
      <div class="card-header">
        .github/workflows/R-CMD-check.yaml
        <span class='text-muted'>
          actions
        </span>
      </div>
      <ul class="list-group list-group-flush">
            <li class="list-group-item">
              actions/checkout
              <i>v3</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
            <li class="list-group-item">
              r-lib/actions/check-r-package
              <i>v2</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
            <li class="list-group-item">
              r-lib/actions/setup-r
              <i>v2</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
            <li class="list-group-item">
              r-lib/actions/setup-r-dependencies
              <i>v2</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
      </ul>
    </div>
    <div class="card mb-3">
      <div class="card-header">
        .github/workflows/test-coverage.yaml
        <span class='text-muted'>
          actions
        </span>
      </div>
      <ul class="list-group list-group-flush">
            <li class="list-group-item">
              actions/checkout
              <i>v3</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
            <li class="list-group-item">
              actions/upload-artifact
              <i>v3</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
            <li class="list-group-item">
              r-lib/actions/setup-r
              <i>v2</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
            <li class="list-group-item">
              r-lib/actions/setup-r-dependencies
              <i>v2</i>
              <small class='text-muted'>
                composite
              </small>
            </li>
      </ul>
    </div>
    <div class="card mb-3">
      <div class="card-header">
        DESCRIPTION
        <span class='text-muted'>
          cran
        </span>
      </div>
      <ul class="list-group list-group-flush">
            <li class="list-group-item">
              R
              <i>>= 3.2.0</i>
              <small class='text-muted'>
                depends
              </small>
            </li>
            <li class="list-group-item">
              data.table
              <i>*</i>
              <small class='text-muted'>
                imports
              </small>
            </li>
            <li class="list-group-item">
              igraph
              <i>*</i>
              <small class='text-muted'>
                imports
              </small>
            </li>
            <li class="list-group-item">
              tibble
              <i>*</i>
              <small class='text-muted'>
                imports
              </small>
            </li>
            <li class="list-group-item">
              urltools
              <i>*</i>
              <small class='text-muted'>
                imports
              </small>
            </li>
            <li class="list-group-item">
              utils
              <i>*</i>
              <small class='text-muted'>
                imports
              </small>
            </li>
            <li class="list-group-item">
              backbone
              <i>*</i>
              <small class='text-muted'>
                suggests
              </small>
            </li>
            <li class="list-group-item">
              stats
              <i>*</i>
              <small class='text-muted'>
                suggests
              </small>
            </li>
            <li class="list-group-item">
              testthat
              <i>>= 3.0.0</i>
              <small class='text-muted'>
                suggests
              </small>
            </li>
      </ul>
    </div>


</div>
    </div>

    <footer class="footer dark-section">
  <div class="container">
    <div class="row">
      <div class="col-md-8">
        <a class="site-logo site-logo--white" href="/">Ecosyste.ms</a>
        <p class="small">Tools and open datasets to support, sustain, and secure critical digital infrastructure.</p>
        <p class="small">
          Code: <a href="https://github.com/ecosyste-ms/documentation/blob/main/LICENSE">AGPL-3</a>  — 
          Data: <a target="_blank" href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a>
        </p>
        <p class='footer-icons'>
          <a target="_blank" href="https://github.com/ecosyste-ms">
            <svg width="20" height="20" alt="ecosyste.ms on Github" class="bi bi-github" viewBox="0 0 16 16" fill="currentColor" version="1.1" aria-hidden="true"><path d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27s1.36.09 2 .27c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8"></path></svg>
</a>          <a target="_blank" href="https://mastodon.social/@ecosystems">
            <svg width="20" height="20" alt="ecosyste.ms on Mastodon" class="bi bi-mastodon" viewBox="0 0 16 16" fill="currentColor" version="1.1" aria-hidden="true"><path d="M11.19 12.195c2.016-.24 3.77-1.475 3.99-2.603.348-1.778.32-4.339.32-4.339 0-3.47-2.286-4.488-2.286-4.488C12.062.238 10.083.017 8.027 0h-.05C5.92.017 3.942.238 2.79.765c0 0-2.285 1.017-2.285 4.488l-.002.662c-.004.64-.007 1.35.011 2.091.083 3.394.626 6.74 3.78 7.57 1.454.383 2.703.463 3.709.408 1.823-.1 2.847-.647 2.847-.647l-.06-1.317s-1.303.41-2.767.36c-1.45-.05-2.98-.156-3.215-1.928a4 4 0 0 1-.033-.496s1.424.346 3.228.428c1.103.05 2.137-.064 3.188-.189zm1.613-2.47H11.13v-4.08c0-.859-.364-1.295-1.091-1.295-.804 0-1.207.517-1.207 1.541v2.233H7.168V5.89c0-1.024-.403-1.541-1.207-1.541-.727 0-1.091.436-1.091 1.296v4.079H3.197V5.522q0-1.288.66-2.046c.456-.505 1.052-.764 1.793-.764.856 0 1.504.328 1.933.983L8 4.39l.417-.695c.429-.655 1.077-.983 1.934-.983.74 0 1.336.259 1.791.764q.662.757.661 2.046z"></path></svg>
</a>          <a target="_blank" href="https://opencollective.com/ecosystems">
            <svg width="20" height="20" alt="ecosyste.ms on Open Collective" class="bi bi-opencollective" viewBox="0 0 16 16" fill="currentColor" version="1.1" aria-hidden="true"><path fill-opacity=".4" d="M12.995 8.195c0 .937-.312 1.912-.78 2.693l1.99 1.99c.976-1.327 1.6-2.966 1.6-4.683 0-1.795-.624-3.434-1.561-4.76l-2.068 2.028c.468.781.78 1.679.78 2.732z"></path>
  <path d="M8 13.151a4.995 4.995 0 1 1 0-9.99c1.015 0 1.951.273 2.732.82l1.95-2.03a7.805 7.805 0 1 0 .04 12.449l-1.951-2.03a5.07 5.07 0 0 1-2.732.781z"></path></svg>
</a>        </p>
        <div>
          <h3 class="mt-5 h6">Supported by</h3>
          <div class="row justify-content-start align-items-center g-4 mb-4 mb-lg-0">		
            <div class="col-auto">
              <a href="https://www.schmidtfutures.org">
                <img alt="Schmidt Futures" class="img-fluid p3" src="/assets/logo-schmidt-white-efa52873280decb2588e601323ef616a96a7891c254db5cdf0cca626ed85acc5.svg" width="267" height="20" />
              </a>
            </div>
      
            <div class="col-auto">
              <a href="https://oscollective.org">
                <img alt="Open Source Collective" class="img-fluid p3" src="/assets/logo-osc-white-43e420a5624e755fe206869f9c3ff608e9476881d847007a020ea01d37e36dfa.png" width="210" height="56" />
              </a>
            </div>
          </div>
          <p class="mt-3"><a href="https://opencollective.com/ecosystems" class="small">Become a sponsor</a></p>
          </div>
        </div>
      <div class="col-md-4">
        <ul class="list-unstyled footer-links mt-3 small">
          <li><strong><a href="https://ecosyste.ms">About</a></strong></li>
          <li><strong><a href="https://blog.ecosyste.ms">Blog</a></strong></li>
          <li><strong><a href="https://mastodon.social/@ecosystems">Contact</a></strong></li>
          <li><strong><a href="https://ecosyste.ms/privacy">Privacy</a></strong></li>
          <li><strong><a href="https://ecosyste.ms/terms">Terms</a></strong></li>
          <li><strong><a href="https://ecosystems.appsignal-status.com/">Status</a></strong></li>
        </ul>
      </div>
    </div>
  </div>
</footer>
  </body>
</html>