Integrating Tape with Internal Systems: Dashboards, Lights, and Obsidian

Last week, I tackled three challenges that are all connected. Two were questions from others, and one was a personal itch I needed to scratch:

  1. Auto-refreshing a ā€œdashboardā€ on a big office screen that pulls data from multiple views in Tape.
  2. Changing the state of lights (like colour or on/off) based on actions in Tape.
  3. Pushing Tape data into Obsidianā€”this one was for me.

If you havenā€™t already guessed, the common thread here is getting data from Tape into internal systems. Sure, 1 and 2 could have been handled in the cloud, but for various reasons, we needed local solutions.


1. The Dashboard

dashboard
We started by looking at Tapeā€™s built-in dashboards, which are fantastic for many use cases. However, the request was for a dynamic view pulling from multiple apps, and Tape dashboards donā€™t quite support that. The example above pulls data from just one app, but the principle is the same across multiple apps as all we are doing is getting a view.

The First Attempt: WebStudio

I built a solution with WebStudio, a no-code tool I highly recommend checking out. It produced a webpage that pulled Tape data and auto-refreshed. However, the refresh was on a timer, meaning it would make calls to Tape even if nothing had changedā€”a bit inefficient for our needs.

The Final Solution: Webhook-Triggered Refresh

In the end, the best option for this use case was to create a small app that runs on an internal server and refreshes the dashboard only when necessary. Hereā€™s how it works:

  1. Developer Webhooks: Tape sends notifications when records are created or updated.
  2. Internal App: The app listens for these webhook events, fetches the relevant Tape data (via a view), and serves it to the webpage.

Hereā€™s what a webhook configuration in Tape looks like:

With this setup, the webpage updates only when something changes, saving on unnecessary API calls and improving efficiency. Itā€™s still very lightweight but tailored to our needs.


2. Tape into Obsidian

obsidian

For those who donā€™t know, Obsidian is a powerful note-taking/PKM app built around Markdown files. Unlike cloud-based tools like Notion, Obsidian works locally. I sync my vaults across devices using Cloudflareā€™s S3 storage. While this local-first approach has its perks, it also means integrations require a bit more effort.

The Goal

I wanted Tape to create or update Markdown files in Obsidian. For example:

  • When a task is added in Tape, it should appear in a specific Obsidian file.
  • Tasks could link back to Tape records and include metadata like due dates or descriptions.

The Solution: Obsidian Local REST API

Thankfully, thereā€™s an Obsidian plugin called Local REST API that makes this possible. It exposes your vault to HTTP requests, allowing other apps to interact with it.

Using this plugin, I created a Tape automation that:

  1. Sends a taskā€™s data (name, description, links, etc.) to the REST API.
  2. Updates a specific Markdown file in my Obsidian vault.

Hereā€™s a snippet of the code from the script block:

const api = collected_api_key_field_apikey_value; // Auth token for the Obsidian plugin
const recordId = current_record_id;

const baseURL = 'https://yourmachine.yourTailscaleNetworkName.ts.net/unique-uuid/vault';
const filePath = `/3. Endeavour Nexus/TapeActions.md`; // Target Markdown file
const fileURL = `${baseURL}${encodeURIComponent(filePath)}`;
const tapeRecordURL = `https://tapeapp.com/jmc/record/${recordId}`;
const date = date_fns.format(new Date(), 'yyyy-MM-dd'); // Link to Obsidian daily notes

// Build the task text
const text = `- [ ] [${demo_2440008___task_field_name_value}](${tapeRecordURL}) #action [[${date}]]

${demo_2440008___task_field_description_unformatted_value}`;

const response = await http.post(fileURL, {
  headers: {
    "Authorization": api,
    "Content-Type": "text/markdown"
  },
  data: text
});

console.info(JSON.stringify(response));

When executed, this script creates something like this in Obsidian:


Use Cases

This approach can be used for:

ā€¢ Creating project pages in Obsidian when a project is created in Tape.
ā€¢ Logging communications (e.g., emails, tasks).
ā€¢ Connecting daily notes to actions in Tape.

3. Lights

While I havenā€™t built this yet, the idea is similar to the dashboard:

ā€¢ A webhook from Tape triggers an app to send commands to smart lights (e.g., Philips Hue).
ā€¢ Actions like switching lights on/off or changing their colours could reflect project states or deadlines in Tape.

4. Tailscale

Modern small businesses often lack traditional on-prem servers and firewalls. Instead, services are distributed across various devices and platforms. Enter Tailscale.

What is Tailscale?

Tailscale creates secure, private networks between devices, regardless of location. For example, you can link your laptop, phone, and cloud servers as if they were on the same local network.

The Funnel Feature

Using Tailscaleā€™s Funnel, you can expose internal services to the internet via a secure HTTPS addressā€”no port forwarding or firewall fiddling needed. Better still, Funnel can act as a reverse proxy, rewriting URLs to direct traffic to the appropriate internal service.

Hereā€™s a simple example for Obsidian integration:

tailscale funnel --bg --set-path=/unique-uuid https+insecure://localhost:27124

This command:
1. Listens for requests at https://yourmachine.ts.net/unique-uuid.
2. Strips the UUID from the URL and forwards the request to port 27124 on the local machine.

Bringing It All Together

Hereā€™s how everything fits:

ā€¢ Tape triggers: Webhooks notify the app about changes.
ā€¢ Internal services: Tailscale securely routes traffic to these services.
ā€¢ Actions: Whether updating dashboards, sending data to Obsidian, or controlling lights, the principle is the sameā€”efficiently moving Tape data into local systems.


Final Thoughts

These projects showed that internal systems are sometimes needed. However, the power and flexibility of Tape (with a little help from Tailscale) means these donā€™t need to be detached from your core system (Tape).

3 Likes

Amazing as always @Jason!! Thank you!! :smiley:

Itā€™s a fantastic case study. Thanks for sharing all those tools. It

This is again fantastic work Jason, thanks for sharing it! :partying_face:

Love this! I was just turned onto Looker Studio by a client and immediately thought of the possibilities with Tape.

1 Like

Iā€™ve never really found the love for Looker Studio that most people seem to have, its probably one of those things that will suddenly solve a problem for me and I will go ā€˜Oh thatā€™s what all the fuss was aboutā€™ :wink:

1 Like

The thing that looks most attractive to me is the fact that itā€™s tied into the Google ecosystem so it appears to work seamlessly with the rest of their suite.

Outside of that, it doesnā€™t look like it does anything terribly exciting or revolutionary. My friends in the analytics industry have an affinity for power BI.

I think it boils down to preference at the end of the day :man_shrugging:

1 Like