Coder Social home page Coder Social logo

docspell / dsc Goto Github PK

View Code? Open in Web Editor NEW
18.0 4.0 4.0 1.25 MB

Docspell command line interface

Home Page: https://docspell.org/docs/tools/cli

License: GNU General Public License v3.0

Nix 5.62% Rust 93.02% Shell 0.86% Dockerfile 0.49%
rust docspell cli

dsc's Introduction

Integration-Tests License Chat Docker Pulls

docspell cli

This is a command line interface to Docspell, a personal document management system.

The CLI is developed independently with the docspell server. Commands support the current (at the time of writing) version of docspell. When the server upgrades its api, the cli is adopted accordingly.

This CLI is meant to be used by humans and other programs. The default output format is tabular which prints a table to stdout. This same table can be formatted to CSV by using the format option csv. These two formats may omit some details from the server responses for readability reasons. When using this cli from other programs, or when you're looking for some detail, the formats json and lisp are recommended. They contain every detail in a well structured form.

State

This CLI is beta … probably forever. I'm using it a lot and hope that it will be improved over time.

The goal is to eventually have all the REST endpoints covered here, or at least those that are frequently used.

Usage

There are binaries provided at the release page that you can download. Or you can build it as described below.

Run dsc help to see a command overview and global options. These options apply to (almost) all commands. Additionally, each command has its own set of options and arguments. A command has its help available via dsc [subcommand] --help.

Config File

The config file is read from the OS defined location, or it can be specfified explicitly either via an environment variable DSC_CONFIG or as an option. You can run dsc write-config-file to create a default config file in the standard location. The default location on linux systems is ~/.config/dsc/config.toml.

The config file looks like this (also, look in the ci/ folder for another and always up to date example):

docspell_url = "http://localhost:7880"
default_format = "Tabular"
# admin_secret = "test123"
# default_source_id = "<some sorce id>"
# pass_entry = "my/pass/entry"
# pass_otp_secret = "key:totp" #or "my/pass/totp_entry"
# default_account = "demo"
pdf_viewer = ["zathura", "{}"]
# proxy = myproxy.com
# proxy_user = me
# proxy_password = superword
# extra_certificate = /path/to/trust.pem #PEM or DER
# accept_invalid_certificates = false

The pdf_viewer is used with the view command to display the PDF file. It must be a list where the first element is the program to run and subsequent elements are its arguments. For each argument, any {} is replaced by the path to the file.

Authentication

The login command can be used to initially login to docspell server.

It accepts a username and password. It also supports the pass password manager. The user name can be fixed in the config file as well as the entry to use with pass. This means you can then just run dsc login without any arguments. The retrieved session token is stored on your file system next to the config file. Subsequent commands can use the session token. Once it is expired, you need to call dsc login again.

When TOTP is enabled, it is also possible to store the secret in pass and specify the entry to this in the config file at pass_otp_secret. Dsc can then calculate the otp accordingly. If the value starts with key: then the renaming part is used to lookup such a line in the main entry (defined via pass_entry). If not prefixed with key: a separate pass entry is looked up.

For commands file-exists and upload it is possible to use a source id or the integration endpoint instead of being authenticated.

Building

Install nix and run nix-shell or nix develop in the source root. This installs required rust tools. Alternatively, the rust tool chain can be setup with rustup. Currently, dsc requires rust >= 1.54.0.

Building the binary for your platform (The second line strips the binary of debug symbols):

> cargo build --release
> strip target/release/dsc

This requires the openssl libraries installed on your system.

To build against a statically linked rustls library instead, use:

> cargo build --release --no-default-features --features rustls

To include a statically linked openssl, build it via:

> cargo build --release --no-default-features --features vendored-openssl

Shell Integration

The library for parsing command line arguments has a nice feature that generates completions for various shells. This has been build into the dsc tool. For example, in order to have completions in fish, run:

$ dsc generate-completions --shell fish | source

… and enjoy tab completion πŸ˜‰

Run dsc generate-completions --help to see what other shells are supported.

Nix Package

The nix/dsc.nix contains a nix expression to build this package. It can be build using flake enabled nix:

nix build

Or ran as

nix run github:docspell/dsc

The repository provides a package which can be included in your system flake by adding:

{
  inputs.dsc-flake.url = "github:docspell/dsc";
  ...
  outputs =
  ...
    environment.systemPackages = [ dsc-flake.packages.${system}.default ]
  ...
}

And a module for dsc watch. An example of its usage is in nixosConfigurations output of the flake.

Examples

Reset the password of an account:

> dsc admin reset-password user32
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ success β”‚ new password β”‚ message          β”‚
β”‚ true    β”‚ 9rRVrhq19jz  β”‚ Password updated β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Recreate the full text index:

> dsc admin recreate-index
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ success β”‚ message                             β”‚
β”‚ true    β”‚ Full-text index will be re-created. β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Search some documents:

> dsc search 'date>2020-08-01 corr:acme*'
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ id       β”‚ name                    β”‚ state     β”‚ date       β”‚ due β”‚ correspondent β”‚ concerning  β”‚ folder β”‚ tags                         β”‚ fields β”‚
β”‚ 7xoiE4Xd β”‚ DOC-20191223-155729.jpg β”‚ created   β”‚ 2020-09-08 β”‚     β”‚ Acme          β”‚             β”‚        β”‚ Invoice                      β”‚        β”‚
β”‚ BV2po65m β”‚ DOC-20200808-154204.jpg β”‚ confirmed β”‚ 2020-08-08 β”‚     β”‚ Acme          β”‚             β”‚        β”‚ Receipt, Tax                 β”‚        β”‚
β”‚ 8GA2ewgE β”‚ DOC-20200807-115654.jpg β”‚ created   β”‚ 2020-08-07 β”‚     β”‚ Acme          β”‚             β”‚        β”‚ Paper, Receipt               β”‚        β”‚
β”‚ FTUnhZ3A β”‚ DOC-20200804-132305.jpg β”‚ confirmed β”‚ 2020-08-04 β”‚     β”‚ Acme          β”‚             β”‚        β”‚ Receipt, Tax                 β”‚        β”‚
β”‚ 6MKV6SEQ β”‚ DOC-20191223-155707.jpg β”‚ confirmed β”‚ 2020-08-03 β”‚     β”‚ Acme          β”‚ Derek Jeter β”‚        β”‚ Important, Information, Todo β”‚        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Use JSON:

> dsc -f json search 'date>2020-08-01 corr:acme*' | jq | head -n20
{
  "groups": [
    {
      "name": "2020-09",
      "items": [
        {
          "id": "7xoiE4XdwgD-FTGjD91MptP-yrnKpLrJTfg-Eb2S3BCSd38",
          "name": "DOC-20191223-155729.jpg",
          "state": "created",
          "date": 1599566400000,
          "due_date": null,
          "source": "android",
          "direction": "incoming",
          "corr_org": {
            "id": "GDceAkgrk8m-kjBWUmcuLTV-Zrzp85ByXpX-hq5SS4Yp3Pg",
            "name": "Acme"
          },
          "corr_person": null,
          "conc_person": null,
          "conc_equip": null,

Upload some files:

> dsc up README.*
File already in Docspell: README.md
Adding to request: README.txt
Sending request …
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ success β”‚ message          β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ true    β”‚ Files submitted. β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Making a release

  1. Set version in Cargo.toml
  2. Run cargo update to update Cargo.lock
  3. Run nix-build and fix hashes
  4. Commit + Tag
  5. push tag to github

The release is being built by github actions as well as the docker images.

dsc's People

Contributors

antifuchs avatar eikek avatar renovate-bot avatar renovate[bot] avatar seijikun avatar vtimofeenko avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

dsc's Issues

DSC not detecting files from NFS Share

I've left passwords and secrets in the compose, they are randomly generated and will be changed once this is sorted out.

working docker-compose.yml
consumedir:
    image: docspell/dsc:latest
    container_name: docspell-consumedir
    command:
      - dsc
      - "-d"
      - "http://docspell-restserver:7880"
      - "watch"
      - "--delete"
      - "-ir"
      - "--not-matches"
      - "**/.*"
      - "--header"
      - "Docspell-Integration:Consensus-Debtless-Passage5"
      - "/opt/docs"
    restart: unless-stopped
    volumes:
      - /docker_storage/docspell/docs:/opt/docs
    depends_on:
      - restserver

The volume in the configuration above works. If I switch that volume to

 - /mnt/docspell:/opt/docs

which is an NFS share from a remote computer it no longer works. Both have a sub directory with the collective name. I see no logs other than

Watching directory (Recursive): /opt/docs
Press Ctrl-C to quit.

Both Directories and files have the same permissions according to the container. Any Ideas?

Error while using the export command "os error 123"

Hi
Trying to do a full export from docspell using the command
D:\docspell_export>dsc-0.11.0.exe export --target D:\docspell_export

but get the following error after 5 items have sucessfully exported:
"Export - Error creating a file: Die Syntax fΓΌr den Dateinamen, Verzeichnisnamen oder die DatentrΓ€gerbezeichnung ist falsch. (os error 123)"
The german part says "incorrect syntax wrong for filename, directoryname or volume".

I'm running docspell 0.40.0 on windows docker desktop. I really need a full export and cannot use "download all documents" because there are over 4000 of them.

Is there maybe a bug in the export when using umlauts / other non-english characters?

Thanks a lot!

Using `export` raises an error

Hi,
Using export --all option gave me the following error: Error creating a file: Filename too long (os error 36) (taken from the rust backtrace).
Using amd64 v0.6.1 on Linux.

unable to build v0.6.1 (some `extern` functions couldn't be found)

Trying to build dsc with the following commands:

cargo fetch --locked --target "$CARCH-unknown-linux-gnu"
export RUSTUP_TOOLCHAIN=stable
export CARGO_TARGET_DIR=target
cargo build --frozen --release --all-features
strip "target/release/$pkgname"

results in the following error:

   Compiling dsc v0.6.1 (/tmp/makepkg/dsc/src/dsc-0.6.1)                                                                                                                                                                                                                                                                       
error: linking with `cc` failed: exit status: 1                                                                                                                
  |                                                                                                                                                            
  = note: "cc" "-m64" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.0.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.1.r
cgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.10.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.2.rcgu.o" "/tmp/m
akepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.3.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.4.rcgu.o" "/tmp/makepkg/dsc/src/
dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.5.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.6.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/targe
t/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.7.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.8.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build
/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.build_script_build.a916b1cc-cgu.9.rcgu.o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8.99c5ts04rhwrzvd.rcgu.o" "-Wl,--as-needed" "-L" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps" "-L" "/tm
p/makepkg/dsc/src/dsc-0.6.1/target/release/build/libgit2-sys-f61f10a664ac528b/out/build" "-L" "/usr/lib64/rustlib/x86_64-unknown-linux-gnu/lib" "-Wl,-Bstatic" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libvergen-8dea0534e8e5a85f.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libthiserror-4a7e2b3101
07da90.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libsysinfo-5d59f2667786a53e.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libonce_cell-f24eca14babf177a.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libdoc_comment-5008ff57d64df0c5.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/rel
ease/deps/librustc_version-425aa3232e2ac57d.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libsemver-7694be6b27c09a57.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/liburl-79e58f787dc2de35.rlib" "/tmp/makepkg/dsc/s
rc/dsc-0.6.1/target/release/deps/libidna-565e976dd0f653ac.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libunicode_normalization-7c26fc028285a5b0.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libtinyvec-36b1820a6368b98b.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libtinyvec_macros
-0ef5c1c8717b2bb0.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libunicode_bidi-6d02e030010c1888.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libform_urlencoded-51b79dc052aa4cd9.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libpercent_encoding-6307f89f633ac15d.rlib" "/tmp/makepkg/d
sc/src/dsc-0.6.1/target/release/deps/libmatches-76779e83766615c0.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/liblog-442767f83bee7e74.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libcfg_if-4ff3db0efc25f7c0.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/liblibgit2_sys-fa0e881bb32cd9
01.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/liblibz_sys-fb0f04b99662b942.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libbitflags-3198ec478493ceed.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libchrono-5bd59fe0137dc602.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps
/libnum_integer-3a562fb847fde8d5.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libnum_traits-80fa81eb67401716.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libtime-6975a1da8bd433c0.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/liblibc-886814ee9fd38748.rlib" "/tmp/makepkg/dsc/src/dsc
-0.6.1/target/release/deps/libenum_iterator-c71af5c94a3fbf7e.rlib" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libanyhow-5d0a1ffda659c8d2.rlib" "-Wl,--start-group" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-0103c94b60eee7ef.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-cab63b3
26bc16c1f.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-4208e76188ba61d8.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler-2e75732e0ab8b4ee.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-baac0af25a7a1364.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-50
47c72c5e8f5321.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-7a4f9a8f24e7f041.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-5eb53d26e29b5da5.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-7515156b823dcf55.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libru
stc_demangle-217cd9b21838f370.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-e1af85e688c038d2.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-40221ba3a1ba607c.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-60a2208e0f0c7767.rlib" "/usr/lib/rustlib/x86
_64-unknown-linux-gnu/lib/libcfg_if-88b1d284f2ee82a9.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-bd07da843a68b31b.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-cd99d35a54567058.rlib" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-16a8746e020550d6.rlib" "/usr
/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-a2ed33227ac14a20.rlib" "-Wl,--end-group" "/usr/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-2b2f85bda2ad178a.rlib" "-Wl,-Bdynamic" "-lz" "-lgcc_s" "-lutil" "-lrt" "-lpthread" "-lm" "-ldl" "-lc" "-Wl,--eh-frame-hdr" "-Wl,-znoexecstack" "-L" "/usr/lib64/
rustlib/x86_64-unknown-linux-gnu/lib" "-o" "/tmp/makepkg/dsc/src/dsc-0.6.1/target/release/build/dsc-c48f73984fa4f8d8/build_script_build-c48f73984fa4f8d8" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-nodefaultlibs"
  = note: /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libvergen-8dea0534e8e5a85f.rlib(vergen-8dea0534e8e5a85f.vergen.52f8761c-cgu.6.rcgu.o): in function `git2::repo::Repository::open':
          vergen.52f8761c-cgu.6:(.text._ZN4git24repo10Repository4open17had1a32fa89fa862dE+0x1a6): undefined reference to `git_repository_open'                                                                                                                                                                                 
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libvergen-8dea0534e8e5a85f.rlib(vergen-8dea0534e8e5a85f.vergen.52f8761c-cgu.6.rcgu.o): in function `git2::repo::Repository::discover':
          vergen.52f8761c-cgu.6:(.text._ZN4git24repo10Repository8discover17h478ae4d474d225dbE+0x244): undefined reference to `git_repository_discover'                                                                                                                                                                         
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libvergen-8dea0534e8e5a85f.rlib(vergen-8dea0534e8e5a85f.vergen.52f8761c-cgu.6.rcgu.o): in function `git2::repo::Repository::discover':
          vergen.52f8761c-cgu.6:(.text._ZN4git24repo10Repository8discover17h7ecbd7d815bedf45E+0x251): undefined reference to `git_repository_discover'                                                                                                                                                                         
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.0.rcgu.o): in function `git2::ObjectType::str':                                                                                                                                
          git2.063d0b48-cgu.0:(.text._ZN4git210ObjectType3str17h4fb75bd620e61377E+0x14): undefined reference to `git_object_type2string'                                                                                                                                                                                       
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.1.rcgu.o): in function `git2::repo::Repository::revparse_single':
          git2.063d0b48-cgu.1:(.text._ZN4git24repo10Repository15revparse_single17hf878f56353ca4b79E+0x1ac): undefined reference to `git_revparse_single'                                                                                                                                                                       
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.1.rcgu.o): in function `git2::repo::Repository::path':                                                                                                                         
          git2.063d0b48-cgu.1:(.text._ZN4git24repo10Repository4path17h6d8ebce5eea6675aE+0xe): undefined reference to `git_repository_path'                                                                                                                                                                                     
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.1.rcgu.o): in function `git2::repo::Repository::head_detached':                                                                                                                
          git2.063d0b48-cgu.1:(.text._ZN4git24repo10Repository13head_detached17h498b250cbed80f72E+0x12): undefined reference to `git_repository_head_detached'                                                                                                                                                                 
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.1.rcgu.o): in function `git2::repo::Repository::branches':                                                                                                                     
          git2.063d0b48-cgu.1:(.text._ZN4git24repo10Repository8branches17he088465cdc81cbbeE+0x7e): undefined reference to `git_branch_iterator_new'                                                                                                                                                                            
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.1.rcgu.o): in function `git2::repo::Repository::find_reference':
          git2.063d0b48-cgu.1:(.text._ZN4git24repo10Repository14find_reference17h587c8652aa59cd7eE+0x1d7): undefined reference to `git_reference_lookup'                                                                                                                                                                       
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.1.rcgu.o): in function `git2::repo::Repository::describe':
          git2.063d0b48-cgu.1:(.text._ZN4git24repo10Repository8describe17h01a1d131c48eef5bE+0x8b): undefined reference to `git_describe_workdir'                                                                                                                                                                               
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.1.rcgu.o): in function `<git2::repo::Repository as core::ops::drop::Drop>::drop':                                                                                              
          git2.063d0b48-cgu.1:(.text._ZN64_$LT$git2..repo..Repository$u20$as$u20$core..ops..drop..Drop$GT$4drop17h9a987da03971bee8E+0x6): undefined reference to `git_repository_free'              
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.13.rcgu.o): in function `git2::error::Error::last_error':                                                                                                                      
          git2.063d0b48-cgu.13:(.text._ZN4git25error5Error10last_error17h2d195acc6e05905dE+0x1d): undefined reference to `git_error_last'               
          /usr/bin/ld: git2.063d0b48-cgu.13:(.text._ZN4git25error5Error10last_error17h2d195acc6e05905dE+0x9e): undefined reference to `git_error_clear'                                                                                                                                                                        
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.4.rcgu.o): in function `git2::branch::Branch::is_head':
          git2.063d0b48-cgu.4:(.text._ZN4git26branch6Branch7is_head17h42375737236cbb86E+0x26): undefined reference to `git_branch_is_head'                                                                                                                                                                                     
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.4.rcgu.o): in function `git2::branch::Branch::name_bytes':                                                                                                                     
          git2.063d0b48-cgu.4:(.text._ZN4git26branch6Branch10name_bytes17h4ff9ee9912543fbaE+0x8b): undefined reference to `git_branch_name'                                                                                                                                                                                    
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.4.rcgu.o): in function `<git2::branch::Branches as core::iter::traits::iterator::Iterator>::next':                                                                             
          git2.063d0b48-cgu.4:(.text._ZN81_$LT$git2..branch..Branches$u20$as$u20$core..iter..traits..iterator..Iterator$GT$4next17hfd9b71d298804292E+0x7c): undefined reference to `git_branch_next'      
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.4.rcgu.o): in function `<git2::branch::Branches as core::ops::drop::Drop>::drop':                                                                                              
          git2.063d0b48-cgu.4:(.text._ZN64_$LT$git2..branch..Branches$u20$as$u20$core..ops..drop..Drop$GT$4drop17h388ebea521a917aeE+0x6): undefined reference to `git_branch_iterator_free'                                          
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.4.rcgu.o): in function `<git2::buf::Buf as core::ops::drop::Drop>::drop':
          git2.063d0b48-cgu.4:(.text._ZN56_$LT$git2..buf..Buf$u20$as$u20$core..ops..drop..Drop$GT$4drop17h6e619cb79d6917d4E+0x3): undefined reference to `git_buf_dispose'                                                   
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.6.rcgu.o): in function `<git2::oid::Oid as core::fmt::Display>::fmt':
          git2.063d0b48-cgu.6:(.text._ZN53_$LT$git2..oid..Oid$u20$as$u20$core..fmt..Display$GT$3fmt17hd7ffcfbc0c2c9166E+0x48): undefined reference to `git_oid_tostr'          
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.7.rcgu.o): in function `git2::describe::Describe::format':                                                                                                                     
          git2.063d0b48-cgu.7:(.text._ZN4git28describe8Describe6format17had6f73910451da79E+0x10c): undefined reference to `git_describe_format'                
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.7.rcgu.o): in function `<git2::describe::Describe as core::ops::drop::Drop>::drop':                                                                                            
          git2.063d0b48-cgu.7:(.text._ZN66_$LT$git2..describe..Describe$u20$as$u20$core..ops..drop..Drop$GT$4drop17h53da411a67ad3273E+0x6): undefined reference to `git_describe_result_free'                                                                                                                                  
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.7.rcgu.o): in function `git2::object::Object::id':  
          git2.063d0b48-cgu.7:(.text._ZN4git26object6Object2id17h450d944811db81e3E+0x12): undefined reference to `git_object_id'                               
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.7.rcgu.o): in function `git2::object::Object::kind':                                                                                                                           
          git2.063d0b48-cgu.7:(.text._ZN4git26object6Object4kind17h9689b3c33f506b1dE+0x6): undefined reference to `git_object_type'                            
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.7.rcgu.o): in function `git2::object::Object::short_id':                                                                                                                       
          git2.063d0b48-cgu.7:(.text._ZN4git26object6Object8short_id17h5e032183e92fc804E+0xc8): undefined reference to `git_object_short_id'                   
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.7.rcgu.o): in function `<git2::object::Object as git2::object::CastOrPanic>::cast_or_panic':                                                                                   
          git2.063d0b48-cgu.7:(.text._ZN66_$LT$git2..object..Object$u20$as$u20$git2..object..CastOrPanic$GT$13cast_or_panic17h7117987f8d0ce68bE+0x26e): undefined reference to `git_object_type'                                                                                                                               
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.7.rcgu.o): in function `<git2::object::Object as core::ops::drop::Drop>::drop':                                                                                                
          git2.063d0b48-cgu.7:(.text._ZN62_$LT$git2..object..Object$u20$as$u20$core..ops..drop..Drop$GT$4drop17he5160294efc2818eE+0x6): undefined reference to `git_object_free'                                                                                                                                               
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.8.rcgu.o): in function `git2::commit::Commit::id':                                                                                                                             
          git2.063d0b48-cgu.8:(.text._ZN4git26commit6Commit2id17h2c6c3e0982733247E+0x12): undefined reference to `git_commit_id'                               
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.8.rcgu.o): in function `git2::commit::Commit::time':                                                                                                                           
          git2.063d0b48-cgu.8:(.text._ZN4git26commit6Commit4time17hf5d5fc128522b369E+0xe): undefined reference to `git_commit_time'                            
          /usr/bin/ld: git2.063d0b48-cgu.8:(.text._ZN4git26commit6Commit4time17hf5d5fc128522b369E+0x21): undefined reference to `git_commit_time_offset'       
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.8.rcgu.o): in function `<git2::commit::Commit as core::ops::drop::Drop>::drop':                                                                                                
          git2.063d0b48-cgu.8:(.text._ZN62_$LT$git2..commit..Commit$u20$as$u20$core..ops..drop..Drop$GT$4drop17h51def8b7a6bfe1adE+0x6): undefined reference to `git_commit_free'                                                                                                                                               
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.8.rcgu.o): in function `git2::reference::Reference::name_bytes':                                                                                                               
          git2.063d0b48-cgu.8:(.text._ZN4git29reference9Reference10name_bytes17h35937db9bced1433E+0xe): undefined reference to `git_reference_name'                                                                                                                                                                            
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.8.rcgu.o): in function `git2::reference::Reference::resolve':                                                                                                                  
          git2.063d0b48-cgu.8:(.text._ZN4git29reference9Reference7resolve17h090e5e28d85d734dE+0x62): undefined reference to `git_reference_resolve'                                                                                                                                                                            
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.8.rcgu.o): in function `git2::reference::Reference::peel':                                                                                                                     
          git2.063d0b48-cgu.8:(.text._ZN4git29reference9Reference4peel17h00e3a69ef48015ebE+0x6e): undefined reference to `git_reference_peel'                                                                                                                                                                                  
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/libgit2-028c9ab519adab25.rlib(git2-028c9ab519adab25.git2.063d0b48-cgu.8.rcgu.o): in function `<git2::reference::Reference as core::ops::drop::Drop>::drop':                                                                                          
          git2.063d0b48-cgu.8:(.text._ZN68_$LT$git2..reference..Reference$u20$as$u20$core..ops..drop..Drop$GT$4drop17h9eb321c14d57a89eE+0x6): undefined reference to `git_reference_free'                                                                                                                                      
          /usr/bin/ld: /tmp/makepkg/dsc/src/dsc-0.6.1/target/release/deps/liblibgit2_sys-fa0e881bb32cd901.rlib(libgit2_sys-fa0e881bb32cd901.libgit2_sys.394df111-cgu.0.rcgu.o): in function `libgit2_sys::init::{{closure}}':                                                                                                  
          libgit2_sys.394df111-cgu.0:(.text._ZN11libgit2_sys4init28_$u7b$$u7b$closure$u7d$$u7d$17hc2c77712816fe83eE+0x14): undefined reference to `git_libgit2_init'                                                                                                                                                           
          /usr/bin/ld: libgit2_sys.394df111-cgu.0:(.text._ZN11libgit2_sys4init28_$u7b$$u7b$closure$u7d$$u7d$17hc2c77712816fe83eE+0x25): undefined reference to `git_error_last'                                                                                                                                                
          collect2: error: ld returned 1 exit status                                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                               
  = help: some `extern` functions couldn't be found; some native libraries may need to be installed or have their path specified                                                                                                                                                                                               
  = note: use the `-l` flag to specify native libraries to link                                                                                                                                                                                                                                                                
  = note: use the `cargo:rustc-link-lib` directive to specify the native libraries to link with Cargo (see https://doc.rust-lang.org/cargo/reference/build-scripts.html#cargorustc-link-libkindname)

File-naming for the by_* links

The export function is interesting, because it exports all of docspells' internal data into an easy to use data-format.
Though while I expect the items folder to be potentially interesting for importing into other solutions (thus processing by machines), I would regard the by_* folders more as something like nice-to-have for the user.

So, assuming that the by_* folders are only interesting for users and not for machine processing - does it make sense to name the files after the IDs of the documents? IMHO, instead sanitizing the documents' name and using that as link name would make more sense. Another option would be to make it configurable, like: --link-naming=id, --link-naming=name.

What do you think about this? (I would implement it then)

File names containing quotes are not uploaded properly

I've started to use the consume-dir mode of dsc recently and I dumped a whole load of old documents in. This worked fairly well for the most part (though I had to restart dsc a few times throughout the process because it would time out when uploading a big file) but as I was cataloging the documents today I noticed a few of them were titled integration: No files supplied. When I looked at them, the only attachments were labeled as No name. This seemed very odd, and I had to spend some time going back through the original files I had backed up to figure out what their names used to be.

I started to fix the names and such, by manually reuploading the documents and deleting the broken ones, but a pattern emerged: the files that were broken were the ones that contained a pair of double quotes in their names, such as a file titled Essay on "The Jungle".pdf.

This also seemed to cause the full-text search of Docspell to silently fail with a 422 HTTP code when one of these broken files appears in the results. Since the files are totally missing an attachmentName field, Docspell fails to decode the response:

Caused by: DecodingFailure(Missing required field, List(DownField(attachmentName), DownArray, DownField(docs), DownField(response)))

I only stumbled on this since I tried to search for the content of the documents to see if I could find one with a similar name, but that did not work. Overall this isn't a big issue, but I assume it's a trivial fix as well.

Thanks for your time and making this nice tool!

404 not found using dsc watch on docker

Hello,

I get a 404 error when trying to set up a watch folder. What could be the issue?

Got: /opt/docs/StarFoundry/Artisan_2012_review-by-tubby.pdf
Cmd: Watch: Uploading failed: An http error occurred: An error was received from http://docspell-restserver:7880/api/v1/open/integration/checkfile/StarFoundry/c405ded5de9e7c9830ab4fe1dc3ef7dea62a3b04df4ae0d2ae5915f745a09efe: HTTP status client error (404 Not Found) for url (http://docspell-restserver:7880/api/v1/open/integration/checkfile/StarFoundry/c405ded5de9e7c9830ab4fe1dc3ef7dea62a3b04df4ae0d2ae5915f745a09efe)
Watching directory (Recursive): /opt/docs

Compose file:

version: '3.8'
services:
 restserver:
    image: docspell/restserver:latest
    container_name: docspell-restserver
    restart: unless-stopped
    ports:
      - "7880:7880"
    environment:
      - TZ=Europe/Berlin
      - DOCSPELL_SERVER_BASE__URL=http://192.168.178.20:7880
      - DOCSPELL_SERVER_BIND_PORT=7880
      - DOCSPELL_SERVER_INTERNAL__URL=http://docspell-restserver:7880
      - DOCSPELL_SERVER_ADMIN__ENDPOINT_SECRET="4xY26.7zakRFps#"
      - DOCSPELL_SERVER_AUTH_SERVER__SECRET="aY6xf4ab@%c9Zg!"
      - DOCSPELL_SERVER_BACKEND_JDBC_PASSWORD="docspelldbpass"
      - DOCSPELL_SERVER_BACKEND_JDBC_URL=jdbc:postgresql://db:5432/docspelldb
      - DOCSPELL_SERVER_BACKEND_JDBC_USER=dbuser
      - DOCSPELL_SERVER_BIND_ADDRESS=0.0.0.0
      - DOCSPELL_SERVER_FULL__TEXT__SEARCH_ENABLED=true
      - DOCSPELL_SERVER_FULL__TEXT__SEARCH_SOLR_URL=http://docspell-solr:8983/solr/docspell
      - DOCSPELL_SERVER_INTEGRATION__ENDPOINT_ENABLED=true
      - DOCSPELL_SERVER_INTEGRATION__ENDPOINT_HTTP__HEADER_ENABLED=true
      - DOCSPELL_SERVER_INTEGRATION__ENDPOINT_HTTP__HEADER_HEADER__VALUE=endpoint1ntegr4tion
    depends_on:
      - solr
    networks:
      - internet
      - docker-internal

  consumedir:
    image: docspell/dsc:latest
    container_name: docspell-consumedir
    command:
      - dsc
      - "-d"
      - "http://docspell-restserver:7880"
      - "watch"
      - "-ir"
      - "--not-matches"
      - "**/.*"
      - "--header"
      - "Docspell-Integration:endpoint1ntegr4tion"
      - "/opt/docs"
    restart: unless-stopped
    volumes:
      - /volume1/docker/docspell/docs:/opt/docs:ro
    depends_on:
      - restserver
    networks:
      - docker-internal

networks:
  docker-internal:
    driver: bridge
    internal: true
  internet:
    external: true
    name: internet

Can dsc watch scan upload files from before it was started?

I have just started running dsc watch and am worrying about a failure mode: When dsc watch isn't running and, e.g., an ADF scanner uploads new documents to an SFTP drop directory, starting the dsc watch job does not cause it to submit the files that were previously uploaded.

I guess I can construct a systemd unit that works like this, but probably still has a race condition (e.g. a file getting uploaded at exactly the right/wrong point in time). I think I would love to see this solved in the watch command itself.

thread 'main' panicked at 'overflow when subtracting durations'

When trying to export files immediately after logging in, the following error occurs:

thread 'main' panicked at 'overflow when subtracting durations', library/core/src/time.rs:936:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

This can be reproduced by running:

dsc login --password "..." && dsc export --target target

As a workaround i added a small sleep:

dsc login --password "..." && sleep 0.5 && dsc export --target target

docSpell crushes my host

I succeeded to upload various docs. Looks like shorter ones (like onepagers) are processed perfectly.
Unfortunately longer documents (3, 4, ... pages) do crush the system. Seriously: my host system halts. Cannot find issue by syslog.
During the docSpell processing, I could capture the logs in docSpell as of below. You can see, the system tried it several times.
Is there a way to trace more to see why the host crashes?

BTW: as obviously the doc hangs in the queue (which is correct to capture waiting or not processed docs), the system goes down even after reboot. I put docSpell down for the moment :-(

2021-11-16T23:06:23: ============ Start processing Scanner_20211116_230302_002655.pdf ============
2021-11-16T23:06:23: Checking for duplicate files
2021-11-16T23:06:23: Creating new item with 1 attachment(s)
2021-11-16T23:06:23: Creating item finished in 35 ms
2021-11-16T23:06:23: Not an archive: application/pdf
2021-11-16T23:06:23: Converting file Some(Scanner_20211116_230302_002655.pdf) (application/pdf) into a PDF
2021-11-16T23:06:23: Storing input to file /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/infile for running ocrmypdf
2021-11-16T23:06:23: Trying to read the PDF using 0 passwords
2021-11-16T23:06:23: Running external command: ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/infile /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/out.pdf
2021-11-16T23:11:23: Command `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/infile /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/out.pdf` did not finish in 300000 ms!
2021-11-16T23:11:23: Closing process: `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/infile /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/out.pdf`
2021-11-16T23:11:23: PDF conversion failed: Command `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/infile /tmp/docspell-convert/docspell-ocrmypdf4420193545322067078/out.pdf` timed out (300000 ms). Go without PDF file
2021-11-16T23:11:23: Starting text extraction for 1 files
2021-11-16T23:11:23: Extracting text for attachment Scanner_20211116_230302_002655.pdf
2021-11-16T23:11:23: Trying to strip text from pdf using pdfbox.
2021-11-16T23:11:23: Stripped text from PDF is small (0). Trying with OCR.
2021-11-16T23:11:24: Running external command: gs -dLastPage=10 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffscaled8 -sOutputFile=%d.tif -
2021-11-16T23:11:57: Command `gs -dLastPage=10 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffscaled8 -sOutputFile=%d.tif -` finished: 0
2021-11-16T23:11:57: Running external command: unpaper /tmp/docspell-extraction/extractpdf16569395390517346831/3.tif /tmp/docspell-extraction/extractpdf16569395390517346831/u-3.tif
2021-11-16T23:21:52: ============ Start processing Scanner_20211116_230302_002655.pdf ============
2021-11-16T23:21:53: Checking for duplicate files
2021-11-16T23:21:54: Found 1 existing item with these files.
2021-11-16T23:21:54: Found 1 attachments. Use only those from task args: Set(Ident(T7ukrP6RDnSg2bQRUrLmagwKSyvqcnoYzpMpcKhpe8p))
2021-11-16T23:21:56: Not an archive: application/pdf
2021-11-16T23:21:59: Converting file Some(Scanner_20211116_230302_002655.pdf) (application/pdf) into a PDF
2021-11-16T23:21:59: Storing input to file /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/infile for running ocrmypdf
2021-11-16T23:21:59: Trying to read the PDF using 0 passwords
2021-11-16T23:22:02: Running external command: ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/infile /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/out.pdf
2021-11-16T23:27:02: Command `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/infile /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/out.pdf` did not finish in 300000 ms!
2021-11-16T23:27:02: Closing process: `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/infile /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/out.pdf`
2021-11-16T23:27:02: PDF conversion failed: Command `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/infile /tmp/docspell-convert/docspell-ocrmypdf678075622502613186/out.pdf` timed out (300000 ms). Go without PDF file
2021-11-16T23:27:02: Starting text extraction for 1 files
2021-11-16T23:27:02: Extracting text for attachment Scanner_20211116_230302_002655.pdf
2021-11-16T23:27:03: Trying to strip text from pdf using pdfbox.
2021-11-16T23:27:04: Stripped text from PDF is small (0). Trying with OCR.
2021-11-16T23:27:04: Running external command: gs -dLastPage=10 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffscaled8 -sOutputFile=%d.tif -
2021-11-16T23:27:32: Command `gs -dLastPage=10 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffscaled8 -sOutputFile=%d.tif -` finished: 0
2021-11-16T23:27:32: Running external command: unpaper /tmp/docspell-extraction/extractpdf10396688062864706290/3.tif /tmp/docspell-extraction/extractpdf10396688062864706290/u-3.tif
2021-11-16T23:41:32: ============ Start processing Scanner_20211116_230302_002655.pdf ============
2021-11-16T23:41:32: Checking for duplicate files
2021-11-16T23:41:34: Found 1 existing item with these files.
2021-11-16T23:41:34: Found 1 attachments. Use only those from task args: Set(Ident(T7ukrP6RDnSg2bQRUrLmagwKSyvqcnoYzpMpcKhpe8p))
2021-11-16T23:41:36: Not an archive: application/pdf
2021-11-16T23:41:39: Converting file Some(Scanner_20211116_230302_002655.pdf) (application/pdf) into a PDF
2021-11-16T23:41:40: Storing input to file /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/infile for running ocrmypdf
2021-11-16T23:41:40: Trying to read the PDF using 0 passwords
2021-11-16T23:41:43: Running external command: ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/infile /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/out.pdf
2021-11-16T23:46:44: Command `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/infile /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/out.pdf` did not finish in 300000 ms!
2021-11-16T23:46:44: Closing process: `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/infile /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/out.pdf`
2021-11-16T23:46:44: PDF conversion failed: Command `ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/infile /tmp/docspell-convert/docspell-ocrmypdf15883894384752171870/out.pdf` timed out (300000 ms). Go without PDF file
2021-11-16T23:46:44: Starting text extraction for 1 files
2021-11-16T23:46:44: Extracting text for attachment Scanner_20211116_230302_002655.pdf
2021-11-16T23:46:44: Trying to strip text from pdf using pdfbox.
2021-11-16T23:46:45: Stripped text from PDF is small (0). Trying with OCR.
2021-11-16T23:46:45: Running external command: gs -dLastPage=10 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffscaled8 -sOutputFile=%d.tif -
2021-11-16T23:47:13: Command `gs -dLastPage=10 -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffscaled8 -sOutputFile=%d.tif -` finished: 0
2021-11-16T23:47:13: Running external command: unpaper /tmp/docspell-extraction/extractpdf7190717107757986522/3.tif /tmp/docspell-extraction/extractpdf7190717107757986522/u-3.tif
2021-11-17T0:17:01: ============ Start processing Scanner_20211116_230302_002655.pdf ============
2021-11-17T0:17:01: Checking for duplicate files
2021-11-17T0:17:03: Found 1 existing item with these files.
2021-11-17T0:17:03: Found 1 attachments. Use only those from task args: Set(Ident(T7ukrP6RDnSg2bQRUrLmagwKSyvqcnoYzpMpcKhpe8p))
2021-11-17T0:17:04: Not an archive: application/pdf
2021-11-17T0:17:08: Converting file Some(Scanner_20211116_230302_002655.pdf) (application/pdf) into a PDF
2021-11-17T0:17:08: Storing input to file /tmp/docspell-convert/docspell-ocrmypdf14291576652977881737/infile for running ocrmypdf
2021-11-17T0:17:08: Trying to read the PDF using 0 passwords
2021-11-17T0:17:11: Running external command: ocrmypdf -l deu --skip-text --deskew -j 1 /tmp/docspell-convert/docspell-ocrmypdf14291576652977881737/infile /tmp/docspell-convert/docspell-ocrmypdf14291576652977881737/out.pdf

OAuth Login

Hey,

I'm not sure if this is really an issue or I'm not seeing something obvious. My docspell instance has OAuth as the only way to login, hence the users are not "local" users and don't have a password. So I have the same problem with both the API and DSC: I can't login, since I can't give a password. And also not a session token, because I would need to login to get one.

I've also read through the source code a bit, but didn't get far.
Any help would be appreciated :)

Sebastian Elisa

Didn't show All Folders in the list

I'd like to set up several folders, and assign new files in diffrent dolders. When I want to search them, I'll filter them according to different folders. However, it didn't list all folders I have, but only show me 1 folder. I think that this is a bug that we can improve in the future version.

Self-Signed Certificate

Hi!

Currently I cannot use dsc due to my instance using a certificate signed by a private PKI. I Added the root to my system wide trust store (curl and stuff all works) but dsc won't.

Which trust store does the client use?

I also propose an option to provide the key via cli (and/or config.toml) for folks, that use self-signed certs without PKI.

Have a nice day!

Watch: Support printer lock-files / lock-directories or monitor file-size

My scanner supports storing to a network storage. Its workflow goes like this:

  • Start Scan
  • Scanner connects to network target
  • Creates Lock-Directory with file in it (something like XEROX-LOCK in the target directory)
  • Creates empty scan result file
  • Starts scanning, and streams the result into the file
  • Deletes Lock-Directory
  • Closes network connection

With the current implementation of watch, dsc will upload the file after the timeout of 6 sec hits. However, when scanning multi-page documents where I have to flip the pages a couple of times, with the scanner waiting on my input - the scan process takes way longer than that. The timeout is configurable, however to be sure that it does not try to upload during some really big document scan, I would have to set it to something like 15 minutes.

Would it make sense to implement support for lock-files? I don't know how many scanners behave that way..
Another idea: Would it maybe make sense to check for the file-size, and only upload after the file-size has not changed for timeout seconds?

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Awaiting Schedule

These updates are awaiting their schedule. Click on a checkbox to get an update now.

  • Lock file maintenance

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

cargo
Cargo.toml
  • chrono 0.4.38
  • clap 4.5.4
  • clap_complete 4.5.2
  • console 0.15.8
  • csv 1.3
  • dialoguer 0.11
  • dirs 5.0.1
  • env_logger 0.11.3
  • glob 0.3.1
  • hex 0.4.3
  • log 0.4.21
  • notify 4.0.17
  • openssl 0.10.64
  • percent-encoding 2.3.1
  • prettytable-rs 0.10
  • reqwest 0.12.4
  • rsotp 0.1.0
  • serde 1.0.200
  • serde-lexpr 0.1.3
  • serde_json 1.0.116
  • sha2 0.10.8
  • snafu 0.8.2
  • toml 0.8.12
  • webbrowser 0.8.15
  • zip 0.6.6
  • pathdiff 0.2.1
  • sanitize-filename 0.5
  • assert_cmd 2.0.14
  • predicates 3.1.0
  • vergen 7.5.1
  • file-locker 1.1.2
  • file-locker 1.1.2
docker-compose
ci/docker-compose.yml
dockerfile
ci/docspell-server/Dockerfile
docker/dsc.dockerfile
github-actions
.github/workflows/cicd.yml
  • actions/checkout v4@3df4ab11eba7bda6032a0b82a6bb43b11571feac
  • actions-rs/toolchain v1
  • actions-rs/cargo v1
  • actions/checkout v4@3df4ab11eba7bda6032a0b82a6bb43b11571feac
  • actions-rs/toolchain v1
  • actions-rs/cargo v1
  • actions/checkout v4@3df4ab11eba7bda6032a0b82a6bb43b11571feac
  • actions-rs/toolchain v1
  • actions-rs/cargo v1
.github/workflows/int_test.yml
  • actions/checkout v4@3df4ab11eba7bda6032a0b82a6bb43b11571feac
  • actions-rs/toolchain v1
  • actions-rs/clippy-check v1
.github/workflows/publish.yml
  • actions/checkout v4@3df4ab11eba7bda6032a0b82a6bb43b11571feac
  • actions-rs/toolchain v1
  • actions-rs/cargo v1
  • softprops/action-gh-release v1
  • ncipollo/release-action v1
  • actions/checkout v4@3df4ab11eba7bda6032a0b82a6bb43b11571feac
  • actions-rs/toolchain v1
  • actions-rs/cargo v1
  • softprops/action-gh-release v1
  • ncipollo/release-action v1
  • actions/checkout v4@3df4ab11eba7bda6032a0b82a6bb43b11571feac
  • actions-rs/toolchain v1
  • actions-rs/cargo v1
  • softprops/action-gh-release v1
  • ncipollo/release-action v1
  • actions/checkout v4.1.7@692973e3d937129bcbf40652eb9f2f61becf3332
  • docker/setup-qemu-action v3
  • docker/setup-buildx-action v3
  • docker/login-action v3

  • Check this box to trigger a request for Renovate to run again on this repository

Export occasionally crash

Hey!
Continuing our adventure from a few months back in #111, I noticed that with v0.9.0 I sometimes get an error when running an export command:

dsc export --all --target .

The error I get with RUST_BACKTRACE=full:

thread 'main' panicked at 'overflow when subtracting durations', library/core/src/time.rs:988:31
stack backtrace:
   0:           0x93c4fc - <unknown>
   1:           0x9803cc - <unknown>
   2:           0x933ea3 - <unknown>
   3:           0x93ee22 - <unknown>
   4:           0x93ea05 - <unknown>
   5:           0x93f473 - <unknown>
   6:           0x93f190 - <unknown>
   7:           0x93c9a4 - <unknown>
   8:           0x93eec9 - <unknown>
   9:           0x414ce1 - <unknown>
  10:           0x97eb81 - <unknown>
  11:           0x97eb2b - <unknown>
  12:           0x414bd6 - <unknown>
  13:           0x982cb7 - <unknown>
  14:           0x42e590 - <unknown>
  15:           0x457b52 - <unknown>
  16:           0x51fc64 - <unknown>
  17:           0x4961bd - <unknown>
  18:           0x417fa0 - <unknown>
  19:           0x415d73 - <unknown>
  20:           0x415e69 - <unknown>
  21:           0x93bc40 - <unknown>
  22:           0x418222 - <unknown>

Since it has to do with the time library, I'm guessing it can explain why it only happens occasionally and it cannot be reproduced reliably.

Let nix users specify the rust platform?

Integrating dsc in my nix flake (which forces users to pin all revisions of all software), I get an error:

error: in pure evaluation mode, 'fetchTarball' requires a 'sha256' argument

which I'm tracing back to https://github.com/docspell/dsc/blob/master/nix/rust-platform.nix#L3-L4, where fetchTarball is invoked in a way that prevents hermetic encapsulation. I think it's fine to provide this as a default for non-pinned builds, but it would be very nice if we were able to override the rustPlatform argument to the package.

Watch option with --exclude

Hi,
I'm not sure where to put the --exclude option when running dsc with the watch option. Right now I'm using:
dsc -d http://docspell-restserver:7880 watch --delete -ir --header Docspell-Integration:xyz /opt/docs --exclude *@SynoEAStream
but I'm getting this error message

error: Found argument '--exclude' which wasn't expected, or isn't valid in this context
If you tried to supply `--exclude` as a PATTERN use `-- --exclude`
USAGE:
dsc watch <dirs>... --delete --integration --recursive --header <header>
For more information try --help

Obviously -- --exclude is not a valid option, but how can I use it?

how to start "dsc watch" with server start

I am newbie to docspell and still exploring. looks awesome so far!
I installed by docker-compose
I downloaded "dsc" to the host-system and did a dsc watch 'my scaninput', but obviously this is not started automatically and not demonized.
a) how is it meant to get this run with start of the server?
b) also found that I would have to perform a login regularily as I get an error " Error refreshing session." after a while. how to retain the login?
c) last: could ther files be deleted automatically after being uploaded to docspell?

Content-Lenght:0 for empty POST requests required by some httpd

Some http-servers like IIS or Lighttpd require a "Content-Lenght:0" http header to fulfill a POST request with empty body (or else you will receive a http 411 status code telling you that the content lenght is missing).

This is for example when re-creating the Solr index dcs admin -a xxxx recreate-index.

~/docker/docspell$ ./dsc admin -a secret recreate-index
Cmd: Admin: RecreateIndex: An http error occurred: An error was received from https://myserver.com/api/v1/admin/fts/reIndexAll: HTTP status client error (411 Length Required) for url (https://myserver.com/api/v1/admin/fts/reIndexAll)

Fails to compile: type mismatch resolving `<InteractSnafu as IntoError<Error>>::Source == Error`

Think something may have gone wrong in a version update: I can no longer install the master branch of this repo & CI fails, too:

   Compiling dsc v0.11.0-pre (/project)
error[E0271]: type mismatch resolving `<InteractSnafu as IntoError<Error>>::Source == Error`
Error:    --> src/cli/cmd/view.rs:139:22
    |
139 |             .context(InteractSnafu)?
    |              ------- ^^^^^^^^^^^^^ expected `dialoguer::Error`, found `std::io::Error`
    |              |
    |              required by a bound introduced by this call
    |
    = note: `std::io::Error` and `dialoguer::Error` have similar names, but are actually distinct types
note: `std::io::Error` is defined in crate `std`
   --> /rust/lib/rustlib/src/rust/library/std/src/io/error.rs:67:1
    |
67  | pub struct Error {
    | ^^^^^^^^^^^^^^^^
note: `dialoguer::Error` is defined in crate `dialoguer`
   --> /cargo/registry/src/index.crates.io-6f17d22bba15001f/dialoguer-0.11.0/src/error.rs:7:1
    |
7   | pub enum Error {
    | ^^^^^^^^^^^^^^
note: required by a bound in `snafu::ResultExt::context`
   --> /cargo/registry/src/index.crates.io-6f17d22bba15001f/snafu-0.7.5/src/lib.rs:568:26
    |
566 |     fn context<C, E2>(self, context: C) -> Result<T, E2>
    |        ------- required by a bound in this associated function
567 |     where
568 |         C: IntoError<E2, Source = E>,
    |                          ^^^^^^^^^^ required by this bound in `ResultExt::context`

For more information about this error, try `rustc --explain E0271`.
error: could not compile `dsc` (lib) due to previous error

My closest suspect is this PR: #384 where dialoguer got updated. The parent commit on master succeeded CI, and none of the commits following its merge do.

dsc client with Windows and NAS

Hi everyone

I'm trying to use dsc export feature to export all data out of my docspell instance on my Synology NAS. I tried to look everywhere I could think of, but I didn't manage to even connect dsc to my NAS. I know there should be a config file somewhere, or it should be created somehow, but even with dsc --help I have no clue how to connect with my NAS using dsc on Windows.

Do you have any starting point on how to proceed?

[Feature Request] A "full checkout" / "full backup" option

Hi,
I've had this idea to use dsc in order to make a full backup of the documents in an organized structure that'll represent the structure in Docspell as closely as possible.

What I had in mind is something like the following structure:

documents
└── document_title
    β”œβ”€β”€ file-a.pdf
    └── file-b.pdf

This could then be extended to include other "metadata" represented in a file directory structure using symlinks.
For example, by-date:

by-date
└── 1970-01-01
          └── document_title -> ../../documents/document_title
              β”œβ”€β”€ file-a.pdf
              └── file-b.pdf

or by-tag: (note how it appears multiple times to represent multiple tags)

by-tag
└── #important-stuff
          └── document_title -> ../../documents/document_title
              β”œβ”€β”€ file-a.pdf
              └── file-b.pdf
└── #invoices
          └── document_title -> ../../documents/document_title
              β”œβ”€β”€ file-a.pdf
              └── file-b.pdf

The main goal for me at least is to have another backup copy independent of Docspell that I can have alongside Docspell backups for any catastrophe situation. Somewhat gloomy but if I'm gone or unable to maintain the Docspell instance anymore, my family would still have access to all the documents through those backups.

What do you think?

Failure when using doc upload

When I tray to upload documents with the doc tool, I get the following error:

Cmd: Upload: An http error occurred: Session error: Error reading session file at /home/doc-user/.config/dsc/dsc-token.json: No such file or directory (os error 2)!

This is, what the .config/dsc/config.toml looks like:

docspell_url = "http://localhost:7880"
default_format = "Tabular"
pdf_viewer = ["zathura", "{}"]

Am I missing something? I also tried it with the following entry in the toml:

default_account = "COLLECTION\username"

But I still get the same error.

exclude subfolders from watched folder

Hi,

would it be possible to add a command line option to exclude certain subfolders or patterns from beeing considered for an upload? Backgroud for this request is, that sometimes sum index programs create certain files or folders in my consume directoy which confuse the watch deamon.

Best regards,
Andreas

flake: odd error about recursive description

I'm trying to add dsc as a nix flake to my own system definition's flake, by adding its overlay to the system's nixos overlays; when I do that and put the package onto environment.systemPackages, I get this error:

error: attribute 'description' missing

       at /nix/store/wazf8xj3bp131skjhl3lkk1w8sbmr7aa-source/flake.nix:59:27:

           58|             inherit version;
           59|             description = self.description;
             |                           ^
           60|             pname = name;
(use '--show-trace' to show detailed location information)

That's indeed a line that occurs in flake.nix here. I'm not sure why it fails like this; on a nix repl in the flake, using and inspecting the package works.

FR: when filesystem backend is used: export symlinks only

I am coming from Paperless-NGX, which maintains all documents on the filesystem, rather than the database. As a consequence, the developers made the actual storage location configurable for each document type, and named this concept Storage Paths.

We've been using storage paths to export views into the DMS as read-only Samba shares, such that people could actually browse the DMS content with Windows Explorer, and find e.f. invoices sorted by year under \Invoices\2023\some_file_title.pdf. This made the migration to Paperless a lot easier since existing habits and tools didn't need to be changed right away, or at least not completely.

With Docspell, it occurs to me that almost the same can be achieved using dsc export run by Cron at regular intervals. However, depending on the size of the documents in the system, this could be quite a cruel process on the disk/SSD and system in general.

If the filesystem backend is already used, and the system on which dsc runs has access to the storage, then the data are already accessible on disk. Wouldn't it be conceivable for the API to then just return paths instead of file content, and dsc to symlink the existing files?

Obviously, they must not be modified, and this would be within the realm of the administrator to ensure. Here Be Dragons…

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.