Last week, I was running a data processing pipeline at 2 AM when it hit an error. The log file was 50MB, too large for Slack, and I needed my teammate in Berlin to review it ASAP. Instead of wrestling with cloud storage APIs or email attachments, I added three lines of Python code to my error handler. Five seconds later, my teammate had a download link. That's when I realized: automated file sharing shouldn't be an afterthought in our scripts—it should be built-in from day one.
Table of Contents
- The Automation Gap: Why File Sharing Breaks Our Workflows
- Enter tflink: File Sharing as Simple as print()
- Getting Started: 60 Seconds to Your First Upload
- Real-World Use Cases
- Production-Ready Error Handling
- Advanced Automation Patterns
- Best Practices and Security Considerations
- Wrapping Up: Build It Once, Use It Everywhere
The Automation Gap: Why File Sharing Breaks Our Workflows
Here's a scenario every developer knows too well: You've built an elegant Python script that processes data, generates reports, or monitors systems. Everything runs smoothly until you need to share the output files. Suddenly, your automated workflow hits a manual bottleneck:
❌ The Manual Approach
Wait for script to finish → Download files locally → Upload to Dropbox/Drive → Copy sharing link → Paste into Slack/email
❌ The "Enterprise" Approach
Configure AWS S3 → Set up IAM roles → Write boto3 code → Handle bucket policies → Generate presigned URLs → Hope nothing breaks
✅ The Developer Approach
Add three lines of code → Get instant download link → Ship it
The problem isn't that cloud storage solutions don't work—it's that they're overkill for temporary file sharing. When you need to share a log file, export data for a colleague, or send processed images from a script, you don't need storage. You need sharing.
"I spent two hours setting up S3 bucket permissions just to share debug logs with my team. Then I discovered tflink and replaced it all with a 3-line Python function. Sometimes the best solution is the simplest one."
— Reddit user on r/Python
Enter tflink: File Sharing as Simple as print()
The tflink Python package brings the same simplicity philosophy that made requests popular: complex functionality wrapped in an intuitive API. It's built specifically for developers who need programmatic file sharing without the infrastructure overhead.
Why tflink Fits the Developer Workflow
- Zero Configuration: No API keys, no account setup for basic usage. Install and run.
- Three-Line Integration: From installation to working upload in under 60 seconds.
- Pythonic Design: Type hints, clear exceptions, intuitive method names.
- Production Ready: Proper error handling, timeout controls, and size validation.
- Global CDN: Files served via Cloudflare Workers for fast access worldwide.
- Automatic Cleanup: Anonymous uploads auto-delete after 7 days—no storage management needed.
Think of it as the difference between subprocess.Popen() and subprocess.run()—both work, but one makes you productive immediately.
Getting Started: 60 Seconds to Your First Upload
Let me show you how fast this is. Here's the complete workflow:
Installation
pip install tflink
Your First Upload (Anonymous)
from tflink import TFLinkClient
# Create client and upload
client = TFLinkClient()
result = client.upload('report.pdf')
# Share the link
print(f"Download: {result.download_link}")
That's it. Three lines of actual code. The package handles:
- HTTP multipart upload formatting
- File size validation (100MB default limit)
- Network error handling with retries
- Response parsing and validation
- MIME type detection
Real Example: Error Log Uploader
Here's how I integrated it into my error handler:
import logging
from tflink import TFLinkClient
from tflink.exceptions import TFLinkError
def handle_critical_error(error_log_path):
"""Upload error logs and notify team"""
try:
client = TFLinkClient()
result = client.upload(error_log_path)
# Now you have a shareable link
notify_team(
message=f"Critical error occurred. Logs: {result.download_link}",
file_size=f"{result.size / 1024 / 1024:.2f} MB"
)
logging.info(f"Error log uploaded: {result.download_link}")
except TFLinkError as e:
logging.error(f"Failed to upload logs: {e}")
# Fallback to local logging
notify_team("Critical error - check server logs")
This pattern works for any automated notification system: Slack webhooks, Discord bots, email alerts, PagerDuty incidents—anywhere you need to include file references.
Real-World Use Cases
After using tflink in production for several months, here are the patterns where it shines:
1. CI/CD Pipeline Artifacts
# In your GitHub Actions or Jenkins pipeline
from tflink import TFLinkClient
def publish_build_artifacts(build_dir):
"""Upload build artifacts and post to PR"""
client = TFLinkClient()
artifacts = []
for file in Path(build_dir).glob('*.zip'):
result = client.upload(file)
artifacts.append({
'name': file.name,
'link': result.download_link,
'size': result.size
})
# Post to GitHub PR comment
comment = "🎉 Build artifacts ready:\n\n"
for artifact in artifacts:
size_mb = artifact['size'] / 1024 / 1024
comment += f"- [{artifact['name']}]({artifact['link']}) ({size_mb:.2f} MB)\n"
post_pr_comment(comment)
2. Data Processing Pipeline Outputs
# Daily ETL job
from tflink import TFLinkClient
import pandas as pd
def process_and_share_daily_report():
"""Generate and share daily analytics report"""
# Process data
df = run_analytics_pipeline()
# Export to Excel
output_file = f"analytics_report_{date.today()}.xlsx"
df.to_excel(output_file, index=False)
# Upload and share
client = TFLinkClient()
result = client.upload(output_file)
# Send to stakeholders
send_email(
to=['team@company.com'],
subject=f"Daily Analytics Report - {date.today()}",
body=f"""
Daily report is ready for review.
Download: {result.download_link}
File size: {result.size / 1024 / 1024:.2f} MB
This link will expire in 7 days.
"""
)
# Clean up local file
os.remove(output_file)
3. Machine Learning Model Outputs
# Training script with result sharing
from tflink import TFLinkClient
def train_and_share_results(model, dataset):
"""Train model and share results with team"""
# Training
history = model.fit(dataset, epochs=100)
# Generate visualizations
plot_file = generate_training_plots(history)
metrics_file = export_metrics_csv(history)
model_file = save_model(model)
# Upload all results
client = TFLinkClient()
results = {
'plots': client.upload(plot_file),
'metrics': client.upload(metrics_file),
'model': client.upload(model_file)
}
# Share in Slack
post_to_slack(f"""
🤖 Model training completed!
📊 Training Plots: {results['plots'].download_link}
📈 Metrics CSV: {results['metrics'].download_link}
💾 Model File: {results['model'].download_link}
Review and let me know if we should deploy.
""")
4. Automated Screenshot/Image Processing
# Web scraping with screenshot sharing
from tflink import TFLinkClient
from selenium import webdriver
def monitor_website_changes(url):
"""Capture and share screenshots for monitoring"""
# Take screenshot
driver = webdriver.Chrome()
driver.get(url)
screenshot_file = f"screenshot_{datetime.now().isoformat()}.png"
driver.save_screenshot(screenshot_file)
driver.quit()
# Upload and share
client = TFLinkClient()
result = client.upload(screenshot_file)
# Alert team if changes detected
if detect_changes(screenshot_file):
send_alert(f"""
⚠️ Website change detected!
Screenshot: {result.download_link}
""")
os.remove(screenshot_file)
5. Database Export Automation
# Automated database backup with sharing
from tflink import TFLinkClient
import subprocess
def backup_and_share_database():
"""Create database backup and share with team"""
backup_file = f"db_backup_{date.today()}.sql.gz"
# Create compressed backup
subprocess.run([
'pg_dump',
'-h', 'localhost',
'-U', 'postgres',
'mydb'
], stdout=open('backup.sql', 'w'))
subprocess.run(['gzip', 'backup.sql'])
os.rename('backup.sql.gz', backup_file)
# Upload and share
client = TFLinkClient()
result = client.upload(backup_file)
# Log and notify
logging.info(f"Database backup created: {result.download_link}")
notify_devops(f"""
✅ Daily database backup completed
Download: {result.download_link}
Size: {result.size / 1024 / 1024:.2f} MB
Expires: 7 days from now
""")
Production-Ready Error Handling
In production, things fail. Networks timeout. Files get corrupted. Here's how to handle it properly:
from tflink import TFLinkClient
from tflink.exceptions import (
TFLinkError,
FileNotFoundError,
UploadError,
NetworkError
)
import logging
def robust_file_upload(file_path, retries=3):
"""Production-ready file upload with retry logic"""
client = TFLinkClient(timeout=120) # 2 minute timeout
for attempt in range(retries):
try:
result = client.upload(file_path)
logging.info(f"Upload successful: {result.download_link}")
return result
except FileNotFoundError:
logging.error(f"File not found: {file_path}")
raise # Don't retry, file missing is permanent
except UploadError as e:
if "too large" in str(e).lower():
logging.error(f"File exceeds size limit: {e}")
raise # Don't retry, file too big is permanent
else:
logging.warning(f"Upload failed (attempt {attempt + 1}): {e}")
if attempt < retries - 1:
time.sleep(2 ** attempt) # Exponential backoff
continue
raise
except NetworkError as e:
logging.warning(f"Network error (attempt {attempt + 1}): {e}")
if attempt < retries - 1:
time.sleep(2 ** attempt)
continue
raise
except TFLinkError as e:
logging.error(f"Unexpected error: {e}")
raise
raise UploadError("Max retries exceeded")
Advanced Automation Patterns
Batch Processing with Progress Tracking
from tflink import TFLinkClient
from pathlib import Path
from tqdm import tqdm # Progress bar
def batch_upload_with_progress(directory):
"""Upload multiple files with progress tracking"""
client = TFLinkClient()
files = list(Path(directory).glob('*.pdf'))
results = []
failed = []
for file in tqdm(files, desc="Uploading files"):
try:
result = client.upload(file)
results.append({
'file': file.name,
'link': result.download_link,
'size': result.size
})
except Exception as e:
failed.append({'file': file.name, 'error': str(e)})
# Generate summary report
summary = f"""
Batch Upload Complete
=====================
Total files: {len(files)}
Successful: {len(results)}
Failed: {len(failed)}
Links:
"""
for item in results:
summary += f"\n- {item['file']}: {item['link']}"
if failed:
summary += "\n\nFailed uploads:\n"
for item in failed:
summary += f"\n- {item['file']}: {item['error']}"
return summary
Authenticated Uploads for Persistent Storage
import os
from tflink import TFLinkClient
def upload_important_artifacts():
"""Upload files that shouldn't auto-delete"""
client = TFLinkClient(
user_id=os.getenv('TFLINK_USER_ID'),
auth_token=os.getenv('TFLINK_AUTH_TOKEN')
)
if not client.is_authenticated():
raise ValueError("Authentication required for persistent uploads")
result = client.upload('important_data.zip')
# These files won't auto-delete after 7 days
save_to_database({
'artifact_url': result.download_link,
'uploaded_to': result.uploaded_to, # Shows "user: YOUR_ID"
'upload_date': datetime.now()
})
Integration with Async Workflows
import asyncio
from concurrent.futures import ThreadPoolExecutor
from tflink import TFLinkClient
async def async_batch_upload(files):
"""Upload multiple files concurrently"""
client = TFLinkClient()
def upload_file(file_path):
return client.upload(file_path)
# Run uploads in thread pool
with ThreadPoolExecutor(max_workers=5) as executor:
loop = asyncio.get_event_loop()
tasks = [
loop.run_in_executor(executor, upload_file, file)
for file in files
]
results = await asyncio.gather(*tasks, return_exceptions=True)
# Process results
successful = [r for r in results if not isinstance(r, Exception)]
failed = [r for r in results if isinstance(r, Exception)]
return successful, failed
Best Practices and Security Considerations
1. File Size Awareness
from tflink import TFLinkClient
# Set custom size limit for your use case
client = TFLinkClient(max_file_size=50 * 1024 * 1024) # 50MB limit
try:
result = client.upload('large_file.zip')
except UploadError as e:
if "too large" in str(e):
# Consider compression or splitting
compress_and_retry()
2. Sensitive Data Handling
# DON'T upload sensitive data anonymously
# DO use authenticated uploads with controlled access
# Bad: Anonymous upload of sensitive data
client = TFLinkClient()
result = client.upload('customer_data.csv') # ❌ Anyone with link can access
# Good: Authenticated upload with your own access control
client = TFLinkClient(user_id=USER_ID, auth_token=TOKEN)
result = client.upload('customer_data.csv') # ✅ Under your account control
3. Environment-Based Configuration
import os
from tflink import TFLinkClient
def get_client():
"""Factory function for environment-aware client"""
if os.getenv('ENVIRONMENT') == 'production':
# Production: Use authenticated uploads
return TFLinkClient(
user_id=os.getenv('TFLINK_USER_ID'),
auth_token=os.getenv('TFLINK_AUTH_TOKEN'),
timeout=300
)
else:
# Development: Anonymous uploads are fine
return TFLinkClient(timeout=60)
4. Link Expiration Awareness
# Remember: Anonymous uploads expire in 7 days
# Document this in your notifications
result = client.upload('report.pdf')
message = f"""
Report ready: {result.download_link}
⏰ This link expires in 7 days ({date.today() + timedelta(days=7)})
📦 File size: {result.size / 1024 / 1024:.2f} MB
Download and save locally if needed beyond this date.
"""
notify(message)
5. Cleanup and Resource Management
from pathlib import Path
from tflink import TFLinkClient
def process_and_share_with_cleanup(data):
"""Proper resource management pattern"""
temp_file = Path(f"temp_{uuid.uuid4()}.csv")
try:
# Process data
df = process_data(data)
df.to_csv(temp_file)
# Upload
client = TFLinkClient()
result = client.upload(temp_file)
return result.download_link
finally:
# Always clean up temp files
if temp_file.exists():
temp_file.unlink()
Wrapping Up: Build It Once, Use It Everywhere
After integrating tflink into my automation toolkit, I've noticed something interesting: once you have effortless file sharing in your scripts, you start using it everywhere. That random log analyzer you wrote? Add three lines and it posts results to Slack. That nightly backup script? Now it sends download links to your team. That data processing pipeline? Results are automatically shareable.
The best developer tools are the ones that disappear into your workflow. You don't think about them—they just work. That's what tflink brings to Python automation: file sharing so simple it becomes automatic.
Quick Start Recap
# Install
pip install tflink
# Use
from tflink import TFLinkClient
client = TFLinkClient()
result = client.upload('file.pdf')
print(result.download_link) # Share this URL
When to Use tflink
- ✅ Sharing script outputs with team members
- ✅ CI/CD pipeline artifact distribution
- ✅ Automated report generation and sharing
- ✅ Log file collection and analysis
- ✅ Temporary data exchange between systems
- ✅ Quick file sharing in automation workflows
When NOT to Use tflink
- ❌ Long-term file storage (use S3/Drive for that)
- ❌ Files requiring complex access control
- ❌ Files larger than 100MB
- ❌ Highly sensitive data without encryption
Resources
- PyPI Package: https://pypi.org/project/tflink/
- GitHub Repository: https://github.com/tflink-tmpfile/tflink
- tfLink Service: https://tmpfile.link
- Documentation: Full API Reference
💡 Pro Tip: Create a utility module in your project with a configured tflink client and reuse it across all your scripts. It's one of those small abstractions that pays dividends every time you need to share a file.
Now go build something awesome. And when your script generates that perfect visualization, analysis, or report—share it with three lines of code. Your future self (and your team) will thank you.
Happy automating! 🐍🚀