• Stars
    star
    9,337
  • Rank 3,833 (Top 0.08 %)
  • Language
    Go
  • License
    MIT License
  • Created almost 7 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

⚡ Transfer files over wifi from your computer to your mobile device by scanning a QR code without leaving the terminal.

Logo

$ qrcp

Transfer files over Wi-Fi from your computer to a mobile device by scanning a QR code without leaving the terminal.

Go Report Card

You can support development by donating with Buy Me A Coffee.

Join the Telegram channel qrcp_dev or the @qrcp_dev Twitter account for news about the development.

How does it work?

Screenshot

qrcp binds a web server to the address of your Wi-Fi network interface on a random port and creates a handler for it. The default handler serves the content and exits the program when the transfer is complete. When used to receive files, qrcp serves an upload page and handles the transfer.

The tool prints a QR code that encodes the text:

http://{address}:{port}/{random_path}

Most QR apps can detect URLs in decoded text and act accordingly (i.e. open the decoded URL with the default browser), so when the QR code is scanned the content will begin downloading by the mobile browser.

Send files to mobile:

screenshot

Receive files from mobile:

Screenshot

Tutorials

Installation

Install the latest development version with Go

Note: it requires go 1.8

go get github.com/claudiodangelis/qrcp

If using go 1.18 or higher,

go install github.com/claudiodangelis/qrcp@latest

Linux

Download the latest Linux .tar.gz archive from the Releases page, extract it, move the binary to the proper directory, then set execution permissions.

# Extract the archive
tar xf qrcp_0.5.0_linux_x86_64.tar.gz
# Copy the binary
sudo mv qrcp /usr/local/bin
# Set execution permissions
sudo chmod +x /usr/local/bin/qrcp

Raspberry Pi

The following ARM releases are available in the Releases page:

  • armv7
  • arm64

Using a package manager

ArchLinux

Packages available on AUR:

Deb packages (Ubuntu, Debian, etc)

Download the latest .deb package from the Releases page, then run dpkg:

sudo dpkg -i qrcp_0.5.0_linux_x86_64.deb
# Confirm it's working:
qrcp version

RPM packages (CentOS, Fedora, etc)

Download the latest .rpm package from the Releases page, then run rpm:

sudo rpm -i qrcp_0.5.0_linux_x86_64.rpm
# Confirm it's working:
qrcp --help

Windows

Download the latest Windows .tar.gz archive from the Releases page and extract the EXE file.

Scoop

If you use Scoop for package management on Windows, you can install qrcp with the following one-liner:

scoop install qrcp

Chocolatey

If you use Chocolatey for package management on Windows, you can install qrcp with the following one-liner:

choco install qrcp

MacOS

Download the latest macOS .tar.gz archive from the Releases page, extract it, move the binary to the proper directory, then set execution permissions.

# Extract the archive
tar xf qrcp_0.5.0_macOS_x86_64.tar.gz
# Copy the binary
sudo mv qrcp /usr/local/bin
# Set execution permissions
sudo chmod +x /usr/local/bin/qrcp
# Confirm it's working:
qrcp --help

Homebrew

If you use Homebrew for package management on macOS, you can install qrcp with the following one-liner:

brew install qrcp

Usage

Send files

Send a file

qrcp MyDocument.pdf

Send multiple files at once

When sending multiple files at once, qrcp creates a zip archive of the files or folders you want to transfer, and deletes the zip archive once the transfer is complete.

# Multiple files
qrcp MyDocument.pdf IMG0001.jpg
# A whole folder
qrcp Documents/

Zip a file before transferring it

You can choose to zip a file before transferring it.

qrcp --zip LongVideo.avi

Receive files

When receiving files, qrcp serves an "upload page" through which you can choose files from your mobile.

Receive files to the current directory

qrcp receive

Receive files to a specific directory

# Note: the folder must exist
qrcp receive --output=/tmp/dir

Configuration

qrcp works without any prior configuration, however, you can choose to configure to use specific values.

To configure qrcp you can create a configuration file inside $XDG_CONFIG_HOME/qrcp.

Note: On Linux, the $XDG_CONFIG_HOME is .config under user home directory. So, for example, on Linux the configuration file will be $HOME/.config/qrcp/config.yml.

Note: Starting from version 0.10.0, qrcp uses a YAML configuration file instead of the old JSON one. You can automatically migrate the legacy JSON format to the new YAML format by running qrcp config migrate.

Key Type Notes
interface String This value is automatically discovered during the first launch of qrcp, you can set it to override the default. You can use the any interface to bind the web server to 0.0.0.0.
bind String This value is used by qrcp to bind the web server to. Note: if this value is set, the interface parameter is ignored.
port Integer When this value is not set, qrcp will pick a random port at any launch.
path String When this value is not set, qrcp will add a random string at the end of URL.
output String Default directory to receive files to. If empty, the current working directory is used.
fqdn String When this value is set, qrcp will use it to replace the IP address in the generated URL.
keepAlive Bool Controls whether qrcp should quit after transferring the file. Defaults to false.
secure Bool Controls whether qrcp should use HTTPS instead of HTTP. Defaults to false
tls-cert String Path to the TLS certificate. It's only used when secure: true.
tls-key String Path to the TLS key. It's only used when secure: true.

All the configuration parameters can be controlled via environment variables prefixed with QRCP_, for example:

  • $QRCP_INTERFACE
  • $QRCP_PORT
  • $QRCP_KEEPALIVE
  • etc

Config Wizard

The config command launches a wizard that lets you configure parameters like interface, port, fully-qualified domain name and keep alive.

qrcp config

Note: if some network interfaces are not showing up, use the --list-all-interfaces flag to suppress the interfaces' filter.

qrcp --list-all-interfaces config

Configuration File

The default configuration file is stored in $XDG_CONFIG_HOME/qrcp/config.yml, however, you can specify the location of the config file by passing the --config flag:

qrcp --config /tmp/qrcp.yml MyDocument.pdf

Port

By default qrcp listens on a random port. Set the QRCP_PORT environment variable or pass the --port (or -p) flag to choose a specific one:

export QRCP_PORT=8080
qrcp MyDocument

Or:

qrcp --port 8080 MyDocument.pdf

Network Interface

qrcp will try to automatically find the suitable network interface to use for the transfers. If more than one suitable interface is found, it asks you to choose one.

If you want to use a specific interface, pass the --interface (or -i) flag:

# The webserver will be visible by
# all computers on the tun0's interface network
qrcp -i tun0 MyDocument.dpf

You can also use a special interface name, any, which binds the web server to 0.0.0.0, making the web server visible by everyone on any network, even from an external network.

This is useful when you want to transfer files from your Amazon EC2, Digital Ocean Droplet, Google Cloud Platform Compute Instance or any other VPS.

qrcp -i any MyDocument.pdf

Bind

Alternatively to choosing the interface, you can directly specify the address you want qrcp to bind the webserver to.

qrcp --bind 10.20.30.40 MyDocument.pdf

URL

qrcp uses two patterns for the URLs:

  • send: http://{ip address}:{port}/send/{random path}
  • receive: http://{ip address}:{port}/receive/{random path}

A few options are available that override these patterns.

Pass the --path flag to use a specific path for URLs, for example:

# The resulting URL will be
# http://{ip address}:{port}/send/x
qrcp --path=x MyDocument.pdf

Pass the --fqdn (or -d) to use a fully qualified domain name instead of the IP. This is useful in combination with -i any you are using it from a remote location:

# The resulting URL will be
# http://example.com:8080/send/xYz9
qrcp --fqdn example.com -i any -p 8080 MyRemoteDocument.pdf

HTTPS

qrcp supports secure file transfers with HTTPS. To enable secure transfers you need a TLS certificate and the associated key.

You can choose the path to the TLS certificate and keys from the qrcp config wizard, or, if you want, you can pass the --tls-cert and --tls-key:

qrcp --tls-cert /path/to/cert.pem --tls-key /path/to/cert.key MyDocument

A --secure flag is available too, you can use it to override the default value.

Default output directory

Open in browser

If you need a QR to be printed outside your terminal, you can pass the --browser flag. With this flag, qrcp will still print the QR code to the terminal, but it will also open a new window of your default browser to show the QR code.

qrcp --browser MyDocument.pdf

Keep the server alive

It can be useful to keep the server alive after transferring the file, for example, when you want to transfer the same file to multiple devices. You can use the --keep-alive flag for that:

# The server will not shutdown automatically
# after the first transfer
qrcp --keep-alive MyDocument.pdf

Shell completion scripts

qrcp comes with a built-in completion command that generates shell completion scripts.

Bash:

$ source <(qrcp completion bash)

To load completions for each session, execute once:

Linux:

$ qrcp completion bash > /etc/bash_completion.d/qrcp

Note: if you don't want to install completion scripts system-wide, refer to Bash Completion FAQ.

MacOS:

$ qrcp completion bash > /usr/local/etc/bash_completion.d/qrcp

Zsh:

If shell completion is not already enabled in your environment you will need to enable it. You can execute the following once:

$ echo "autoload -U compinit; compinit" >> ~/.zshrc

To load completions for each session, execute once:

$ qrcp completion zsh > "${fpath[1]}/_qrcp"

You will need to start a new shell for this setup to take effect.

Fish:

$ qrcp completion fish | source

To load completions for each session, execute once:

$ qrcp completion fish > ~/.config/fish/completions/qrcp.fish

Authors

qrcp, originally called qr-filetransfer, started from an idea of Claudio d'Angelis (@claudiodangelis on Telegram), the current maintainer, and it's developed by the community.

Join us!

Credits

Logo is provided by @arasatasaygin as part of the openlogos initiative, a collection of free logos for open source projects.

Check out the rules to claim one: rules of openlogos.

Releases are handled with goreleaser.

Clones and Similar Projects

  • qr-fileshare - A similar idea executed in NodeJS with a React interface.
  • instant-file-transfer (Uncredited) - Node.js project similar to this
  • qr-filetransfer - Python clone of this project
  • qr-filetransfer - Another Node.js clone of this project
  • qr-transfer-node - Another Node.js clone of this project
  • QRDELIVER - Node.js project similar to this
  • qrfile - Transfer files by scanning a QR code
  • quick-transfer - Node.js clone of this project
  • share-file-qr - Python re-implementation of this project
  • share-files (Uncredited) - Yet another Node.js clone of this project
  • ezshare - Another Node.js two way file sharing tool supporting folders and multiple files
  • local_file_share - "share local file to other people, OR smartphone download files which is in pc"
  • qrcp - a desktop app clone of qrcp, writing with C# and .NET Core, work for Windows.

License

MIT. See LICENSE.

More Repositories

1

popup-for-keep

📝 Load Google Keep in a popup from the current tab in Google Chrome
JavaScript
54
star
2

banco

📁 A project management tool for the command line
Go
49
star
3

i3-timer

⏰ A simple timer for the i3 window manager
Go
40
star
4

rofi-todo

📓 Minimal todo client for the rofi launcher
Shell
33
star
5

unplug2shutdown

A python tool to shutdown your computer by removing an USB device. Originally intended to be run on RaspberryPi to prevent hard shutdown.
Python
19
star
6

dart_OXO

Dart implementation of the tic-tac-toe game.
Dart
16
star
7

dart_regexp_tester

A simple RegExp tester built with Dart
Dart
16
star
8

dart-bash_completion

Shell
9
star
9

dart-FirefoxOS-Boilerplate-App

JavaScript
8
star
10

dart-samples

DEPRECATED
Dart
8
star
11

h

A bash function to search your history
Shell
7
star
12

selfhosted-screenshots

Shell
4
star
13

dotfiles

Shell
4
star
14

rofi-chrome-profile-launcher

🚀 A Chrome profile launcher for rofi
Shell
4
star
15

headless-chrome-examples

JavaScript
3
star
16

dartchat-demo-codemotionroma2014

App di esempio mostrata durante il Codemotion Roma 2014
Dart
3
star
17

dart-mdv-webcomponents-gdl

Dart
3
star
18

dun-vscode-theme

🐰 A pretty-much-greyscale theme for Visual Studio Code
3
star
19

raspberrypi-playground

Shell
3
star
20

gcurlftpfs

A curlftpfs gui written in python
Python
3
star
21

chrome_app_arduino_hello_lcd

Dart
3
star
22

dart_cli_utils

Shell
3
star
23

dartdemo-appdays2014

Codelab: AppDays 2014, Pordenone (Italy)
Dart
3
star
24

ethereum-test1

Shell
2
star
25

my_first_firefox_os_app_with_dart

Dart
2
star
26

dart_postgresql_example

Dart
2
star
27

scripts

JavaScript
2
star
28

chrome_app_webview_test

JavaScript
2
star
29

dart-FirefoxOS-samples

2
star
30

todoist-hidesidebar

Adds a button to show/hide sidebar
JavaScript
2
star
31

polymer.dart-playground

Dart
2
star
32

id3

Dart library to handle ID3 tags of mp3 files
Dart
2
star
33

QuickAlarms

Android app which acts like a shortcut to Clock's Alarms settings
Java
2
star
34

tools

PHP
2
star
35

claudiodangelis

Source code of my website
HTML
2
star
36

xfce4-toggle-panel

Python
1
star
37

aur-claudiodangelis

AUR packages I maintain and helper tools
Dart
1
star
38

dart_calendar_api_demo

Dart
1
star
39

talk-meeting-torino-9-luglio-2015

1
star
40

dart-mdv-googleplus

Dart
1
star
41

the-gopl-exercises

Go
1
star
42

poc

Shell
1
star
43

WhatsInIt

JavaScript
1
star
44

qrcp-test-arm

1
star
45

trello_dues_to_google_calendar

Dart
1
star
46

distance_from_rome

Sample Dart app
JavaScript
1
star
47

cloudio.sh

Shell
1
star
48

droneio_dartanalyzer_test

Shell
1
star
49

string_metrics

Collection of string metric functions in Dart
Dart
1
star
50

diffbot

A Dart client library for Diffbot APIs
Dart
1
star
51

id3discogs

automagical tag/rename tool for mp3s, fetching data from discogs.com
1
star
52

gdg-meetsu-aquila-livecoding

Dart
1
star