Debit Card Wrapped Data Deletion and Retention Policy

Debit Card Wrapped

Effective Date: May 10th, 2026

1. Introduction

Debit Card Wrapped (“we,” “our,” or “us”) is a mobile application that provides users with insights into their spending habits using financial data obtained through the Plaid API. This Data Deletion and Retention Policy explains how long we retain user data and how users can request deletion of their data.

2. Scope

This policy applies to all personal and financial data processed by Debit Card Wrapped, including data obtained via third-party financial data providers such as Plaid.

3. Types of Data Collected

We may collect and process the following categories of data:

  • Bank transaction data (via Plaid)
  • Account metadata (e.g., account type, balances where applicable)
  • User profile information (e.g., email address, authentication credentials)
  • App usage and analytics data

We do not sell user data or use it for advertising purposes.

4. Data Retention

We retain user data only for as long as necessary to provide the core functionality of the app and comply with legal obligations.

4.1 Active Accounts

While a user maintains an active account, we retain:

  • Transaction data retrieved via Plaid for up to 12 months of historical analysis or the maximum allowed by Plaid access scopes
  • Derived insights and summaries generated by the application
  • User account information required for authentication and service delivery

4.2 Inactive Accounts

If an account is inactive for more than 24 months, we may:

  • Delete or anonymize associated personal data
  • Retain anonymized, aggregated insights that cannot identify the user

4.3 Legal and Security Retention

We may retain certain data for longer periods if required to:

  • Comply with legal obligations
  • Resolve disputes
  • Enforce agreements
  • Maintain security and prevent fraud

5. Data Deletion Requests

Users may request deletion of their data at any time.

5.1 How to Request Deletion

Users can request deletion by:

  • Using the in-app “Delete My Data” feature (if available), or
  • Contacting us at: [Insert Support Email]

5.2 Deletion Process

Upon receiving a verified request, we will:

  • Delete or anonymize personal account data within 30 days
  • Revoke Plaid access tokens associated with the user’s accounts
  • Delete stored transaction data and derived insights, unless retention is required by law

5.3 Third-Party Data (Plaid)

We will also request deletion or token invalidation through Plaid where applicable. However, certain data may remain in aggregated or de-identified form within Plaid systems subject to their own policies.

6. Data Anonymization

In some cases, we may anonymize user data instead of deleting it. Anonymized data:

  • Cannot be linked back to an individual user
  • May be used for improving product features and analytics

7. Backup Systems

Deleted data may persist in encrypted backups for up to 90 days before being permanently overwritten as part of our disaster recovery systems.

8. Security Measures

We implement reasonable technical and organizational safeguards to protect user data, including:

  • Encryption in transit and at rest
  • Access controls and authentication requirements
  • Regular security reviews

9. Changes to This Policy

We may update this policy from time to time. Users will be notified of material changes through the app or email.

10. Contact Information

If you have questions about this policy or your data, contact us at:

Email: chris@topherpedersen.com
Company: Debit Card Wrapped

 

Debit Card Wrapped Privacy Policy

Effective Date: May 10, 2026

Welcome to Debit Card Wrapped (“we,” “our,” or “us”). This Privacy Policy explains how Debit Card Wrapped collects, uses, stores, and protects your information when you use our mobile application (“App”).

By using the App, you agree to the practices described in this Privacy Policy.


1. Information We Collect

Financial Account Information

Debit Card Wrapped uses the Plaid API to securely access certain financial transaction data from your linked bank accounts or debit card accounts.

Through Plaid, we may access:

  • Transaction history
  • Merchant names
  • Transaction dates
  • Transaction amounts
  • Spending categories
  • Account balance information (if authorized)

We do not collect or store your bank login credentials directly. Authentication is handled securely by Plaid.

User-Provided Information

We may collect information you voluntarily provide, such as:

  • Email address
  • Username or display name
  • Feedback or support requests

Device and Usage Information

We may automatically collect limited technical information, including:

  • Device type
  • Operating system
  • App version
  • Basic analytics and crash reports

2. How We Use Your Information

We use your information solely to provide and improve the App experience, including:

  • Generating personalized yearly spending summaries
  • Identifying spending trends and categories
  • Creating entertaining insights and visualizations
  • Improving app functionality and performance
  • Providing customer support
  • Preventing fraud or misuse of the App

We do not sell your financial data or personal information.

We do not use your transaction data for advertising purposes.


3. Data Sharing

We do not share, sell, rent, or trade your personal or financial data with third parties for marketing purposes.

We may share limited information only in the following circumstances:

  • With service providers necessary to operate the App (such as Plaid or cloud hosting providers)
  • If required by law, regulation, or legal process
  • To protect the rights, safety, or security of our users or the App

4. Plaid Integration

Debit Card Wrapped uses Plaid to connect to your financial institution securely.

By linking your financial accounts, you also agree to Plaid’s privacy practices.

You can review Plaid’s Privacy Policy here:

Plaid Privacy Policy


5. Data Storage and Security

We take reasonable administrative, technical, and organizational measures to protect your information.

These measures may include:

  • Encryption in transit
  • Secure cloud infrastructure
  • Access controls and authentication safeguards

However, no method of electronic transmission or storage is completely secure, and we cannot guarantee absolute security.


6. Data Retention

We retain your information only as long as necessary to:

  • Provide the App’s services
  • Comply with legal obligations
  • Resolve disputes
  • Enforce agreements

You may request deletion of your account and associated data at any time by contacting us.


7. Your Rights and Choices

Depending on your location, you may have rights regarding your personal information, including:

  • Accessing your data
  • Correcting inaccurate information
  • Requesting deletion of your data
  • Revoking consent for data access

You may disconnect your linked financial accounts at any time through the App or through Plaid-supported account management tools.


8. Children’s Privacy

Debit Card Wrapped is not intended for children under 13 years of age, and we do not knowingly collect personal information from children.

If we learn that we have collected information from a child under 13, we will delete it promptly.


9. Third-Party Services

The App may rely on third-party services for hosting, analytics, authentication, or financial connectivity. These services may process information on our behalf under their own privacy policies and security practices.


10. Changes to This Privacy Policy

We may update this Privacy Policy from time to time.

If we make material changes, we will update the “Effective Date” above and may notify users through the App or other appropriate means.

Continued use of the App after updates constitutes acceptance of the revised Privacy Policy.


11. Contact Us

If you have questions about this Privacy Policy or your data, you may contact us at:

Email: chris@topherpedersen.com
App: Debit Card Wrapped


12. California Privacy Rights

If you are a California resident, you may have additional rights under the California Consumer Privacy Act (CCPA), including the right to know what personal information is collected and the right to request deletion of your personal information.

Debit Card Wrapped does not sell personal information as defined under the CCPA.


 

Gene Slaughter: The Shadowy Sorcerer

Wanted to post where to watch this new Home Box Office Documentary on Wingsuit Pilot Gene Slaughter AKA The Shadowy Sorcerer for my friends in the secret society of nylon assisted rapid deceleration enthusiasts. Enjoy!

Episode 1: https://drive.google.com/file/d/1GQvyK-jw0o0xvuaretOEgp-RKfFE_Fsu/view?usp=drive_link

Episode 2: https://drive.google.com/file/d/1dyO-1le0g3Tf4v_lv-vVMUpy3oxx9lht/view?usp=drive_link

Episode 3: https://drive.google.com/file/d/1HRNuOtFnRpsXtTtY_7OyT4vqNC6YEa4e/view?usp=drive_link

Episode 4: https://drive.google.com/file/d/1xTDnP0QovoVxNKZMMcE2oEyXsNtTZhU3/view?usp=drive_link

 

2026 Robert Fisher Lead: Roosevelt Lake

Does the comment section of YouTube know more about the whereabouts of fugitive Robert Fisher than the FBI? According to one commenter, Fisher is living in the woods around Roosevelt Lake in Arizona.

Another commenter thinks she saw Fisher in Williams, AZ:

And the last tip I could find was from a woman referencing a 2021 sighting in Christopher Creek, AZ:

 

How to add a GitHub personal access token via the command line on a Mac

It’s been a little while since I’ve had to add a new GitHub personal access token via the command line to be able to clone a GitHub repo. When I first started using GitHub I always used to go the easy route and just use a password. Developers and security people especially love to make things complicated though, so you can’t use a password anymore. This is actually an old change, not something new, but I found today that the easiest way to add a new PAT has actually change. According to Claude, you can use the GitHub CLI, “gh”, to add new PATs. This seems a little different than what I used to do before, so I wanted to write up a quick post on how to do this in case anyone else happens to be looking for the same information.

  1. Create your new Personal Access Token at github.com. After logging in, click on your profile icon > settings > developer settings > Personal access tokens > Tokens (classic) > Generate new token > Generate new token (classic)
  2. After Creating your new token, make sure to save it somewhere you aren’t going to lose it.
  3. Assuming you have brew installed on your Mac, run $ brew install gh
  4. In a new terminal window, login: $ gh auth login
  5. Select paste an authentication token, then paste in your PAT
  6. Last, in a new terminal window, clone your desired repo (assuming it’s your own repo which you have access): $ git clone https://github.com/orgNameHere/repoNameHere
 

I’m back

For the past year every time I’ve randomly checked on my blog to see if it’s still up and running okay, it’s always down. I’ve been hosting this blog myself on DigitalOcean using a Linux Virtual Server for the past 7 or 8 years, and once upon a time it used to run no problem for months or years without any maintenance or anything. Occasionally I’d have to log in to DigitalOcean and restart the server to get the site back up, but that was rare and would normally always do the trick.

Today I saw the site was down again and in the WordPress dashboard it advised that I should update my PHP version which required me to log in to the Linux server from the command line. Then it dawned on me… I’ve never upgraded my server ever. It’s still running the same version of Linux it was running back when I started the blog 7 or 8 years ago.

So then when I actually tried to go and update stuff, I noticed I couldn’t update anything. I think the Linux version on this thing is so old that none of the linux/ubuntu commands work for updating things like they normally would (or at least that’s my theory on why I wasn’t able to update or upgrade anything).

Anyway, I’ve got the site back up and running again, and I updated my WordPress version, but I was not able to upgrade PHP or my Ubuntu Linux version, but I’m glad my old site is back up and running. I used to get a decent amount of traffic from Google but I think I’ve lost all my SEO because the site was always down and unavailable for months and months on end without me noticing. But I’m back! And maybe when I’m feeling up to it, I’m sure WordPress has a feature where I can go export the blog to some sort of file, then I can go into DigitalOcean and just make a brand new virtual server and move everything over to the new virtual server, but I’m not really feeling like doing that much work tonight for my silly website. But hey I updated my header image here on the blog and wrote my first post in a year, so it’s good to be back. Hopefully I’ll have something worth writing about soon. Most things these days get posted to social media and hosting your own site is becoming much less common, but there’s something cool about the free and open web / internet, and I love having my own little slice here at www.topherpedersen.blog on my $7 per month DigitalOcean virtual linux server.

 

Client Side Web Scraping with React-Native

This blog post is going to be really short, and if you happen to have stumbled up on it, hopefullly I’ve got some answers for you. However, I’m really just writing this post because I want to bookmark this information for my future self! haha

With a lot of web scraping technologies, they’re typically intended to be run on a desktop computer or a server that’s able to simulate a web browser. However, setting up your project like this is going to cost you some money to do because you’ll need to spin up a server instance that you have to pay for each month. I have a massive graveyard of dead projects that I’ve had to kill off because I couldn’t afford the server costs. So personally, I’ve been trying to build things that truly don’t need a server and can operate without a centralized backend that costs me money each month.

And fortunately, I discovered a couple of guys on the internet that have run into the same problems and created a solution that you can use in your React-Native apps.

  1. Check out Gift Banda’s Web Scraping in React-Native on Medium
  2. And take the cheerio-without-node-native library for a spin

Cheerio-without-node-native is a fork of the cheerio webscraping library that removes/replaces the modules that make cheerio incompatible in a client-side environment.

I’m sure there are some downsides to doing this client side. I imagine that some things that involve JavaScript rendering and what not you probably won’t be able to do client-side. My guess though is you’ll probably be able to scrape 50 to 80 percent of the stuff you could normally scrape with cheerio.

I haven’t actually used this library yet, so we’ll see if it actually can get the job done. If not, I suppose I’ll just setup a server and a backend and all of that the old fashioned way.

 

How to get the Claude API return a single response instead of multiple messages.

I’ve been working on my first ai powered project recently using the Claude API, but I keep running into this problem that I haven’t been able to get around… Claude won’t give me back a single answer, instead it returns an array of answers of “content blocks.” I actually asked Claude via claude.com and ChatGPT via chatgpt.com how to fix this, but I didn’t get back a working solution. However, I asked Grok via x.com and it actually did give me the solution to this problem! Grok’s solution here: https://x.com/i/grok/share/RgTd0eJc35sUhAg19KtxuVA4L

 

How to Use Anthropic’s New Web Search Tool

This past weekend I tried building my first ai project using ChatGPT’s API. I want to build an app that tells me what bands are playing on any given night in Austin, TX and includes Spotify embeds so I can listen to the bands music so I can decide if I want to go see them or not. This is something I can sort-of do on chatgpt.com, but when trying to do the same thing via OpenAI’s API, I wasn’t actually able to get it to work.

While I was a little deflated that my weekend project was a failure, fast forward a few days and Anthropic launched their new web search tool today! And sure enough, I tried giving Claude via the Anthropic API the same prompt I had given ChatGPT and Claude is able to tell me what bands are playing tonight in Austin, TX at Hotel Vegas, a cool venue by my apartment that has shows 7 days a week 365 days a year.

If you’re interested in using the new web search tool via the Anthropic API, make sure you set the model you’re using to claude-3-7-sonnet-20250219, and add “tools” block when you instantiate your Claude client:

import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: 'YoUR-APi-KeY-GOEs-HeRE', // This is the default and can be omitted
});
async function main() {
const message = await client.messages.create({
max_tokens: 1024,
messages: [{ role: 'user', content: 'What bands are playing tonight at Hotel Vegas in Austin, TX?' }],
model: 'claude-3-7-sonnet-20250219',
// Enable Claude Web Search
tools: [{
type: "web_search_20250305",
name: "web_search",
max_uses: 5
}],
});
console.log(message.content);
}
main();
view raw websearch.js hosted with ❤ by GitHub
 

javascript for loop over properties in an object

Today at work I was tasked with iterating over a JavaScript (TypeScript) object to find a particular property or key nested somewhere within the object. The tricky part is the object can have infinite nesting, so we don’t know how deep we need to dig to find the needle in the haystack.

I thought someone else may end up needing a solution to this problem, so I decided to write this blog post. I found a StackOverflow article which was pretty helpful, however the author of the answer to that question only posted partial bits of the solution, and didn’t post a complete function.

After a little work on replit.com, I came up with a function that does the job for me. For my use case, I only needed to find one needle in the haystack. If you need to find multiple instances of the same property or key, then you’ll need to re-work my function.

Hope you find this function helpful internet friend!

const originalObject = {
foo: {},
bar: "BAR",
baz: {
a: {},
b: {},
c: {
d: "DDD",
e: "EEE",
f: "FFF",
g: "GGG",
h: "HHH",
i: "III",
j: "JJJ",
k: "KKK",
l: "LLL",
m: "MMM",
n: "NNN",
o: "OOO",
p: "PPP",
}
},
}
function findValueOfPropertyInNestedObject(obj: Object, propertyName: string) {
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
const valueOfProperty = obj[prop];
const valueOfPropertyIsObject = typeof valueOfProperty === "object";
const propertyFound = prop === propertyName;
if (propertyFound) {
return valueOfProperty;
}
if (valueOfPropertyIsObject) {
const childValue = findValueOfPropertyInNestedObject(valueOfProperty, propertyName);
if (childValue) {
return childValue;
}
}
}
}
return undefined;
}
const p = findValueOfPropertyInNestedObject(originalObject, "p");
console.log(p);