Affordable Text-to-Video AI: A Beginner’s Guide

black and white robot toy on red wooden table

Introduction

Text-to-video AI tools have revolutionized content creation, allowing anyone to generate video content from simple text descriptions. This tutorial will guide you through the best affordable options and how to get started.

Understanding Text-to-Video AI

Text-to-video AI uses machine learning models to interpret your text prompts and generate corresponding video content. These tools can create anything from realistic scenes to animated sequences, and even talking head presentations.

Best Affordable Options

1. Free Tier Platforms

Runway Gen-3 Alpha

  • Cost: Free tier (125 credits ? 5 seconds) | $12/month for 625 credits
  • Best for: Short, high-quality realistic clips
  • Getting Started:
    1. Sign up at runwayml.com
    2. Navigate to Gen-3 Alpha
    3. Enter your text prompt
    4. Generate and download your video

Pika 2.0

  • Cost: Free tier available | $10/month for extended use
  • Best for: Creative effects and animations
  • Getting Started:
    1. Visit pika.art
    2. Create a free account
    3. Use the prompt box to describe your scene
    4. Experiment with the camera controls and effects

Luma AI (Dream Machine)

  • Cost: Free tier with limits | $30/month for more
  • Best for: Realistic scenes and cinematic shots
  • Getting Started:
    1. Go to lumalabs.ai
    2. Sign up for Dream Machine
    3. Write detailed prompts for best results
    4. Download your 5-second clips

2. Budget-Friendly Specialized Tools

HeyGen ($24/month)

  • Purpose: AI avatar videos (talking heads)
  • Ideal for: Presentations, explainers, course content
  • How to Use:
    1. Choose an avatar
    2. Write or paste your script
    3. Select voice and language
    4. Generate your video

Invideo AI ($20/month)

  • Purpose: Long-form content with stock footage + AI
  • Ideal for: YouTube videos, marketing content
  • How to Use:
    1. Describe your video concept
    2. AI generates a script and storyboard
    3. Review and edit
    4. Export your video

Writing Effective Prompts

Basic Structure

[Subject] + [Action] + [Setting] + [Style/Mood] + [Camera Work]

Examples

Poor Prompt: “A cat”

Good Prompt: “A fluffy orange cat walking through a sun-drenched garden, flowers swaying in the breeze, cinematic lighting, slow-motion, camera tracking shot”

Pro Tips for Better Results

  1. Be Specific: Include details about lighting, time of day, weather
  2. Describe Motion: “walking toward camera”, “spinning slowly”, “zoom in”
  3. Set the Mood: “peaceful”, “dramatic”, “energetic”
  4. Mention Style: “photorealistic”, “anime style”, “3D render”
  5. Keep It Simple: Start with one main subject and action

Step-by-Step: Your First Video

Using Pika (Free)

  1. Sign Up
    • Go to pika.art
    • Create account with email
  2. Write Your Prompt A steaming cup of coffee on a wooden table, morning sunlight streaming through window, steam rising slowly, warm cozy atmosphere, close-up shot
  3. Generate
    • Click generate
    • Wait 1-2 minutes for processing
  4. Refine
    • If unsatisfied, try adding more details
    • Adjust camera movement parameters
    • Regenerate with tweaked prompt
  5. Download
    • Save your video file
    • Note what worked for future reference

Comparing the Options

PlatformBest ForCostOutput LengthQuality
RunwayRealistic clips$0-12/mo3-5 sec?????
PikaCreative effects$0-10/mo3-5 sec????
LumaCinematic shots$0-30/mo5 sec?????
HeyGenTalking heads$24/moMinutes????
InvideoLong-form$20/moMinutes???

Common Mistakes to Avoid

  1. Vague Prompts: “Make a cool video” won’t give good results
  2. Too Complex: Describing 10 things happening at once confuses the AI
  3. Ignoring Free Trials: Test before committing to paid plans
  4. Not Iterating: First attempts rarely perfect – refine your prompts
  5. Wrong Tool: Don’t use Pika for talking heads or HeyGen for landscapes

Workflow Tips

For Social Media Content

  1. Generate 5-10 short clips with Pika/Luma (free tiers)
  2. Download best results
  3. Edit together in CapCut or similar
  4. Add music and text overlays

For Presentations

  1. Use HeyGen for talking head sections
  2. Generate b-roll with Runway
  3. Combine in PowerPoint or Keynote
  4. Export as video

For YouTube Videos

  1. Script your video concept
  2. Use Invideo AI to generate full draft
  3. Replace weak sections with Runway/Pika clips
  4. Final edit in your preferred video editor

Next Steps

  1. Start Free: Try Pika and Luma’s free tiers today
  2. Learn Prompting: Practice writing detailed descriptions
  3. Compare Results: Generate same concept across platforms
  4. Choose Your Tool: Pick based on your specific needs
  5. Upgrade Strategically: Only pay when free tier limits you

Resources

  • Prompt Libraries: Search “text-to-video prompts” on Reddit, Twitter
  • Communities: Join Discord servers for each platform
  • Tutorials: YouTube has platform-specific guides
  • Inspiration: Browse galleries on each platform’s website

Conclusion

Text-to-video AI has become remarkably accessible and affordable. Start with free tiers to learn the tools, focus on improving your prompting skills, and upgrade only when you need more generation capacity. The technology improves monthly, so what seems impossible today might be standard tomorrow.

Happy creating!

How to Change Bookmark Icons in Brave Browser

browser logos

Bookmark icons (also called favicons) help you quickly identify your saved sites. This tutorial shows you multiple ways to change or update these icons in Brave browser.

Table of Contents

  1. Automatic Update Method
  2. Using Browser Extensions
  3. Manual File Edit (Advanced)

Method 1: Automatic Update

Difficulty: Easy
Best for: When the website has changed its icon or the icon isn’t displaying correctly

Steps:

  1. Simply visit the bookmarked website
  2. Brave will automatically fetch and update the favicon
  3. Check your bookmarks bar or bookmarks manager to see the updated icon

Why this works: Brave caches favicons, and visiting the site forces it to refresh the cached icon.


Method 2: Browser Extensions

Difficulty: Easy to Moderate
Best for: Adding custom icons to bookmarks

Steps:

Installing an Extension:

  1. Open Brave browser
  2. Visit the Chrome Web Store (Brave supports Chrome extensions)
  3. Search for one of these extensions:
    • Bookmark Favicon Changer
    • Custom Bookmark Icon
    • Bookmark Manager (various options available)
  4. Click “Add to Brave” or “Add to Chrome”
  5. Confirm the installation

Using the Extension:

  1. Once installed, right-click on any bookmark
  2. Look for the new option added by the extension (usually “Change Icon” or similar)
  3. Choose from:
    • Uploading your own image file
    • Selecting from an icon library
    • Entering a custom URL for an icon
  4. Save your changes

Tip: Most extensions support PNG, JPG, and ICO file formats. For best results, use square images (16×16 or 32×32 pixels).


Method 3: Manual File Edit (Advanced)

Difficulty: Advanced
Best for: Power users comfortable with JSON editing
?? Warning: Always backup the Bookmarks file before editing!

Steps:

1. Close Brave Completely

  • Make sure Brave is fully closed (check your system tray)
  • This prevents the browser from overwriting your changes

2. Locate Your Bookmarks File

Windows:

%LOCALAPPDATA%\BraveSoftware\Brave-Browser\User Data\Default\

macOS:

~/Library/Application Support/BraveSoftware/Brave-Browser/Default/

Linux:

~/.config/BraveSoftware/Brave-Browser/Default/

3. Backup the Bookmarks File

  • Find the file named Bookmarks (no extension)
  • Create a copy and name it Bookmarks.backup

4. Edit the Bookmarks File

  1. Open the Bookmarks file in a text editor (Notepad++, VS Code, or similar)
  2. The file is in JSON format
  3. Search for the name or URL of your bookmark
  4. Find the "favicon" field – it looks like this: "favicon": "data:image/png;base64,iVBORw0KG..."
  5. Replace the base64 data with:
    • A URL to an icon: "favicon": "https://example.com/icon.png"
    • New base64 encoded image data

5. Save and Restart

  1. Save the file
  2. Open Brave
  3. Check your bookmark to see the new icon

Converting an Image to Base64:

If you want to embed a custom icon:

  1. Use an online tool like “Base64 Image Encoder”
  2. Upload your icon image (16×16 or 32×32 pixels recommended)
  3. Copy the resulting base64 string
  4. Paste it into the favicon field (including the data:image/png;base64, prefix)

Troubleshooting

Icon Not Updating?

  • Clear Brave’s cache: Settings ? Privacy and security ? Clear browsing data
  • Make sure you’re visiting the actual website, not a cached version
  • Wait a few minutes – favicon updates can be delayed

Extension Not Working?

  • Check if the extension has permissions enabled
  • Try restarting Brave after installing the extension
  • Verify the extension is compatible with your Brave version

Manual Edit Issues?

  • Ensure Brave was completely closed before editing
  • Check that your JSON syntax is valid (use a JSON validator)
  • Restore from your backup file if something breaks

Tips and Best Practices

  1. Icon Size: Use 16×16 or 32×32 pixel square images for best results
  2. File Format: ICO, PNG, and SVG formats work best
  3. Backup First: Always backup your Bookmarks file before manual editing
  4. Extension Method: For most users, browser extensions are the easiest and safest option
  5. Organize First: Consider organizing your bookmarks into folders before mass icon changes

Conclusion

Changing bookmark icons in Brave is straightforward once you know the right method:

  • Quick fix: Just visit the website
  • Custom icons: Use a browser extension
  • Full control: Edit the Bookmarks file manually (advanced users only)

Choose the method that best fits your technical comfort level and needs!

Connecting Cloud n8n with Local Ollama – Complete Tutorial

an abstract image of a sphere with dots and lines

Introduction

This tutorial will guide you through connecting your cloud-hosted n8n instance with Ollama running locally on your PC. We’ll cover multiple methods, from quick testing solutions to more permanent setups.

What is Ollama?

Ollama is a free, open-source application that lets you run large language models (LLMs) locally on your own computer. Think of it as having ChatGPT running on your PC instead of in the cloud.

Prerequisites

  • n8n instance hosted in the cloud (e.g., n8n.cloud, self-hosted VPS)
  • Ollama installed and running on your local PC
  • Basic command line knowledge
  • Administrator access to your PC

Understanding the Problem

Your cloud n8n instance cannot directly access your local Ollama because:

  • Your local PC is behind a router/firewall
  • It doesn’t have a public IP address accessible from the internet
  • Cloud services can only connect to publicly accessible endpoints

Solution: Create a secure tunnel that exposes your local Ollama to the internet.


Method 1: Using ngrok (Best for Testing)

Why ngrok?

  • Quick setup (5 minutes)
  • Free tier available
  • Automatic HTTPS
  • Perfect for development and testing

Step 1: Install ngrok

  1. Visit ngrok.com and create a free account
  2. Download ngrok for your operating system
  3. Extract the executable to a folder (e.g., C:\ngrok)

Step 2: Configure ngrok

  1. Copy your authtoken from the ngrok dashboard
  2. Open Command Prompt or PowerShell and run: ngrok config add-authtoken YOUR_AUTH_TOKEN

Step 3: Start Ollama

  1. Make sure Ollama is running on your PC
  2. By default, Ollama runs on port 11434
  3. Test it locally by opening: http://localhost:11434

Step 4: Create the Tunnel

  1. Open a new terminal window
  2. Run: ngrok http 11434
  3. You’ll see output like: Forwarding https://abc123-456.ngrok.io -> http://localhost:11434
  4. Copy this URL – this is your public Ollama endpoint!

Step 5: Configure n8n

  1. Log into your n8n instance
  2. Create a new workflow
  3. Add an HTTP Request node
  4. Configure it:
    • Method: POST
    • URL: https://abc123-456.ngrok.io/api/generate
    • Authentication: None
    • Body: JSON
    • JSON Body: { "model": "llama2", "prompt": "Why is the sky blue?", "stream": false}
  5. Execute the node to test

Step 6: Parse the Response

  1. Add a Set node after the HTTP Request
  2. Extract the response:
    • Name: ollama_response
    • Value: {{ $json.response }}

Important Notes for ngrok

  • Free tier: Your URL changes every time you restart ngrok
  • Keep terminal open: The tunnel stays active only while ngrok is running
  • Paid tier: Get a permanent URL that doesn’t change

Method 2: Using Cloudflare Tunnel (Best for Permanent Setup)

Why Cloudflare Tunnel?

  • Free forever
  • More reliable than ngrok free tier
  • Can create named tunnels
  • Better for long-term projects

Step 1: Install Cloudflare Tunnel

Windows (using winget):

winget install --id Cloudflare.cloudflared

Windows (manual):

  1. Download from Cloudflare’s website
  2. Extract to a folder like C:\cloudflared
  3. Add to PATH or use full path in commands

Linux/Mac:

# Linux
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# Mac
brew install cloudflare/cloudflare/cloudflared

Step 2: Authenticate Cloudflare

  1. Run: cloudflared tunnel login
  2. Your browser will open – log in with your Cloudflare account
  3. Select a domain (or create one free at Cloudflare)
  4. Authorize the tunnel

Step 3: Quick Tunnel (Temporary)

For quick testing:

cloudflared tunnel --url http://localhost:11434

This gives you a temporary URL like: https://random-words.trycloudflare.com

Step 4: Named Tunnel (Permanent)

For a permanent setup:

  1. Create a tunnel: cloudflared tunnel create ollama-tunnel Note the tunnel ID that appears
  2. Create a config file (~/.cloudflared/config.yml or C:\Users\YourName\.cloudflared\config.yml): tunnel: TUNNEL_ID_HERE credentials-file: C:\Users\YourName\.cloudflared\TUNNEL_ID.json ingress: - hostname: ollama.yourdomain.com service: http://localhost:11434 - service: http_status:404
  3. Create DNS record: cloudflared tunnel route dns ollama-tunnel ollama.yourdomain.com
  4. Run the tunnel: cloudflared tunnel run ollama-tunnel
  5. Run as a service (optional, so it starts automatically): # Windows (PowerShell as Admin) cloudflared service install # Linux sudo cloudflared service install

Step 5: Use in n8n

Use your tunnel URL: https://ollama.yourdomain.com/api/generate


Method 3: Router Port Forwarding (Advanced)

Why Port Forwarding?

  • No third-party service needed
  • Full control
  • Best performance

When NOT to use this:

  • You don’t have a static IP
  • Your ISP blocks incoming connections
  • You’re not comfortable with network security

Steps:

  1. Find your local IP:
    • Windows: Run ipconfig in CMD
    • Look for “IPv4 Address” (e.g., 192.168.1.100)
  2. Access your router:
    • Usually 192.168.1.1 or 192.168.0.1
    • Log in with admin credentials
  3. Create port forwarding rule:
    • External Port: 11434
    • Internal IP: Your PC’s IP (e.g., 192.168.1.100)
    • Internal Port: 11434
    • Protocol: TCP
  4. Configure Windows Firewall: # Run as Administrator New-NetFirewallRule -DisplayName "Ollama" -Direction Inbound -LocalPort 11434 -Protocol TCP -Action Allow
  5. Set up Dynamic DNS (if no static IP):
    • Use services like DuckDNS, No-IP, or Dynu
    • Install their client on your PC
    • Get a free domain like yourname.duckdns.org
  6. Use in n8n:
    • URL: http://YOUR_PUBLIC_IP:11434/api/generate
    • Or: http://yourname.duckdns.org:11434/api/generate

Building a Complete n8n Workflow

Here’s a practical example workflow that uses your local Ollama:

Workflow: AI-Powered Email Responder

  1. Trigger Node: Manual Trigger or Webhook
  2. HTTP Request Node (Call Ollama):
    • Method: POST
    • URL: YOUR_TUNNEL_URL/api/generate
    • Body: { "model": "llama2", "prompt": "Write a professional email response to: {{ $json.email_content }}", "stream": false}
  3. Code Node (Parse Response): const response = $input.item.json.response; return [{ json: { ai_response: response } }];
  4. Send Email Node or Slack Node:
    • Use {{ $json.ai_response }} as the message

Security Best Practices

1. Add Basic Authentication

Wrap your Ollama endpoint with a reverse proxy (nginx, Caddy) that requires authentication.

2. Use HTTPS Only

  • ngrok: Provides HTTPS automatically
  • Cloudflare: HTTPS by default
  • Port forwarding: Set up Let’s Encrypt

3. IP Whitelisting

If your n8n instance has a static IP, configure your firewall to only accept connections from that IP.

4. Monitor Access

  • Check ngrok/Cloudflare dashboards for unusual traffic
  • Set up alerts for excessive requests

5. Use Environment Variables in n8n

Store your tunnel URL as an environment variable instead of hardcoding it:

  • URL: {{ $env.OLLAMA_URL }}/api/generate

Troubleshooting

“Connection Refused” Error

Check:

  1. Is Ollama running? Test: curl http://localhost:11434
  2. Is your tunnel active? Check the terminal window
  3. Is the URL correct in n8n?

“Timeout” Error

Solutions:

  1. Increase timeout in n8n HTTP Request settings
  2. Use smaller models or shorter prompts
  3. Check your internet connection speed

ngrok URL Changed

Solution:

  • Upgrade to ngrok paid plan for static URLs
  • Or switch to Cloudflare Tunnel (free permanent URLs)

Ollama Not Responding

Check:

  1. Restart Ollama service
  2. Check if port 11434 is already in use: # Windowsnetstat -ano | findstr :11434
  3. Check Ollama logs for errors

Firewall Blocking Connection

Windows:

# Allow Ollama through firewall
New-NetFirewallRule -DisplayName "Ollama" -Direction Inbound -Program "C:\Program Files\Ollama\ollama.exe" -Action Allow

Performance Tips

  1. Use "stream": false in your requests for easier n8n handling
  2. Keep models small for faster responses (e.g., llama2:7b instead of llama2:70b)
  3. Cache responses in n8n if you’re asking the same questions repeatedly
  4. Set appropriate timeouts – AI generation can take 30-60 seconds for longer responses

Cost Comparison

MethodFree TierPaid TierBest For
ngrokURL changes on restart$8/month for static URLTesting
CloudflareFree foreverFree (or paid plans available)Production
Port ForwardFreeFreeAdvanced users

Next Steps

  1. Test the connection with simple prompts
  2. Build a workflow that uses your local LLM
  3. Secure your setup using the security practices above
  4. Scale up by running multiple Ollama models
  5. Automate the tunnel startup using system services

Additional Resources


Conclusion

You now have multiple ways to connect your cloud n8n with local Ollama:

  • Quick testing: Use ngrok
  • Long-term projects: Use Cloudflare Tunnel
  • Maximum control: Use port forwarding

Start with ngrok to test everything works, then move to Cloudflare Tunnel for a permanent setup. Happy automating with local LLMs!

How to Set Up PGP Encryption on Outlook in Windows 11

A wooden block spelling the word encryption on a table

This guide will walk you through setting up PGP (Pretty Good Privacy) encryption for your Outlook email client on Windows 11. Whether you’re starting fresh or migrating from another email client like Thunderbird, this tutorial has you covered.

What You’ll Need

  • Outlook 2016, 2019, or Microsoft 365
  • Windows 11
  • Administrator access to install software
  • Your existing PGP keys (if migrating from another client)

Step 1: Install Gpg4win

Gpg4win is a free, open-source encryption suite that integrates PGP functionality into Outlook.

  1. Download Gpg4win from the official website: https://www.gpg4win.org/
  2. Run the installer (right-click and select “Run as administrator” if needed)
  3. During the installation, you’ll see a component selection screen
  4. Important: Make sure these components are checked:
    • GpgOL – This is the Outlook plugin (critical!)
    • Kleopatra – Certificate and key manager
    • GpgEX – Windows Explorer extension (optional but useful)
  5. Click Next and complete the installation
  6. Restart your computer to ensure all components load properly

Step 2: Set Up Your PGP Keys

If You’re Starting Fresh

  1. Open Kleopatra (search for it in the Start menu)
  2. Click File ? New OpenPGP Key Pair
  3. Enter your name and email address
  4. Click Create
  5. Set a strong passphrase when prompted (you’ll need this to decrypt messages)
  6. Click Finish

If You Have Existing Keys (e.g., from Thunderbird)

Export Keys from Thunderbird

  1. Open Thunderbird
  2. Go to Tools ? OpenPGP Key Manager
  3. Find your key in the list
  4. Right-click your key ? Export Keys to File
  5. Choose to export both public and secret keys
  6. Save the file (e.g., my-pgp-key.asc) to a location you’ll remember

Import Keys into Kleopatra

  1. Open Kleopatra
  2. Click File ? Import Certificates
  3. Navigate to your exported key file (.asc or .gpg file)
  4. Select the file and click Open
  5. Enter your passphrase if prompted
  6. You should see a confirmation that the keys were imported successfully

Step 3: Verify GpgOL is Installed in Outlook

  1. Open Outlook
  2. Look for a GpgOL tab in the ribbon at the top of the window
  3. If you see it, skip to Step 5

If You Don’t See the GpgOL Tab

Don’t worry – you might not have selected it during installation. Here’s how to add it:

  1. Go to Windows Settings ? Apps ? Installed apps
  2. Find Gpg4win in the list
  3. Click the three dots (?) next to it
  4. Select Modify
  5. The installer will open showing current components
  6. Make sure GpgOL is checked
  7. Click Next to install the component
  8. Restart Outlook

Alternative Check: Outlook Add-ins

  1. In Outlook, go to File ? Options ? Add-ins
  2. Look for “GpgOL” in the active add-ins list
  3. If it’s in “Disabled Items”, you’ll need to enable it:
    • At the bottom, change “Manage” dropdown to Disabled Items
    • Click Go
    • Select GpgOL and click Enable

Step 4: Configure GpgOL in Outlook

  1. Open Outlook and click the GpgOL tab
  2. Click Settings (or Options)
  3. In the settings window:
    • Select your default key for signing and encrypting emails
    • Choose whether to sign/encrypt by default (recommended to leave off and choose per email)
    • Configure any other preferences

Step 5: Send Your First Encrypted Email

Sending an Encrypted Message

  1. Click New Email in Outlook
  2. Compose your message as normal
  3. In the GpgOL tab at the top, you’ll see encryption options:
    • Click Encrypt to encrypt the message
    • Click Sign to digitally sign it (proves it’s from you)
    • You can do both for maximum security
  4. Add the recipient’s email address
  5. Important: You must have the recipient’s public key to encrypt to them
  6. Click Send

Receiving an Encrypted Message

  1. When you receive an encrypted email, GpgOL will automatically detect it
  2. You’ll be prompted to enter your passphrase
  3. After entering it, the message will decrypt and display normally

Step 6: Exchange Public Keys with Contacts

For someone to send you encrypted emails, they need your public key. For you to send to them, you need theirs.

Export Your Public Key

  1. Open Kleopatra
  2. Right-click your key
  3. Select Export Certificates
  4. Save the .asc file
  5. Send this file to your contacts (via email, chat, etc.)

Import a Contact’s Public Key

  1. Receive their public key file from them
  2. Open Kleopatra
  3. Click File ? Import Certificates
  4. Select their key file
  5. Verify the key fingerprint with them (optional but recommended for security)
  6. You can now send them encrypted emails

Troubleshooting Common Issues

GpgOL Tab Not Appearing

  • Ensure GpgOL is installed (see Step 3)
  • Check that the add-in isn’t disabled in Outlook
  • Try running Outlook as administrator once
  • Reinstall Gpg4win if necessary

“No Valid Key Found” Error

  • Make sure you’ve imported the recipient’s public key
  • Verify the email address matches exactly
  • Check that your key hasn’t expired in Kleopatra

Can’t Decrypt Received Messages

  • Verify you’re using the correct passphrase
  • Ensure the message was encrypted to your public key
  • Check that your private key is properly imported

Messages Showing as Plain Text

  • Some email servers strip encryption from messages
  • Make sure both you and the recipient are using compatible PGP implementations
  • Try sending a test message to yourself first

Security Best Practices

  1. Protect Your Passphrase: Never share it with anyone
  2. Backup Your Private Key: Store it securely offline
  3. Verify Key Fingerprints: When exchanging keys, verify fingerprints through a separate channel
  4. Set Key Expiration: Consider setting expiration dates on keys for better security
  5. Revoke Compromised Keys: If your key is compromised, generate and distribute a revocation certificate

Additional Resources

  • Gpg4win Documentation: https://www.gpg4win.org/documentation.html
  • GnuPG Manual: https://gnupg.org/documentation/
  • Email Security Best Practices: Search for “PGP email security guide”

Note: This guide uses Gpg4win, which implements the OpenPGP standard. Your encrypted emails will be compatible with other OpenPGP-compliant tools like Thunderbird, GPG Suite (Mac), and various mobile apps.