<!doctype html> <html> <!-- !!! WARNING !!! This file was auto-generated from readme/spec/server_sharing.md and any manual change made to it will be overwritten. To make a change to this file please modify the source Markdown file: https://github.com/laurent22/joplin/blob/dev/readme/spec/server_sharing.md --> <head> <title>Joplin Server sharing feature | Joplin</title> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://joplinapp.org/css/bootstrap.min.css"> <link rel="shortcut icon" type="image/x-icon" href="https://joplinapp.org/favicon.ico"> <!-- <link rel="stylesheet" href="https://joplinapp.org/css/fontawesome-all.min.css"> --> <link rel="stylesheet" href="https://joplinapp.org/css/fork-awesome.min.css"> <script src="https://joplinapp.org/js/jquery-3.2.1.slim.min.js"></script> <style> body { background-color: #F1F1F1; color: #333333; } .root { overflow: hidden; } a[href^="mailto:"] { word-break: break-all; } table { margin-bottom: 1em; } td, th { padding: .8em; border: 1px solid #ccc; } .page-markdown table pre, .page-markdown table blockquote { margin-bottom: 0; } .page-markdown table pre, .page-markdown table blockquote { margin-bottom: 0; } .page-markdown table pre { background-color: rgba(0,0,0,0); border: none; margin: 0; padding: 0; } h1, h2 { border-bottom: 1px solid #eaecef; padding-bottom: 0.3em; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-weight: 600; font-size: 2em; margin-bottom: 16px; } h2 { font-size: 1.6em; } h3 { font-size: 1.3em; } code { color: black; background-color: #eee; border: 1px solid #ccc; font-size: .85em; /* word-break: break-all; */ } pre code { border: none; } pre { font-size: .85em; } blockquote { font-size: 1em; color: #555; }; #toc ul { margin-bottom: 10px; } #toc > ul > li { margin-bottom: 10px; } #toc { padding-bottom: 1em; } .title { display: flex; align-items: center; } .title-icon { display: flex; height: 1em; } .title-text { display: flex; font-weight: normal; margin-bottom: .2em; margin-left: .5em; } .sub-title { font-weight: normal; } .container { background-color: white; padding: 0; box-shadow: 0 10px 20px #888888; } table.screenshots { margin-top: 2em; margin-bottom: 2em; } table.screenshots th { height: 3em; text-align: center; } table.screenshots th, table.screenshots td { border: 1px solid #C2C2C2; } img[align="left"] { margin-right: 10px; margin-bottom: 10px; } .mobile-screenshot { height: 40em; padding: 1em; } .cli-screenshot-wrapper { background-color: black; vertical-align: top; padding: 1em 2em 1em 1em; } .cli-screenshot { font-family: "Monaco", "Inconsolata", "CONSOLAS", "Deja Vu Sans Mono", "Droid Sans Mono", "Andale Mono", monospace; background-color: black; color: white; border: none; } .cli-screenshot .prompt { color: #48C2F0; } .top-screenshot { margin-top: 2em; text-align: center; } .header { position: relative; padding-left: 2em; padding-right: 2em; padding-top: 1em; padding-bottom: 1em; color: white; background-color: #2B2B3D; } .header a h1 { color: white; } .header a:hover { text-decoration: none; } .content { padding-left: 2em; padding-right: 2em; padding-bottom: 2em; padding-top: 2em; } .forkme { position: absolute; right: 0; top:0; } .nav-wrapper { position: relative; width: inherit; } .nav { background-color: black; display: flex; flex-direction: row; align-items: center; } .nav.sticky { position:fixed; top: 0; width: inherit; box-shadow: 0 0 10px #000000; } .nav a { color: white; display: inline-block; padding: .6em .9em .6em .9em; } .nav ul { padding-left: 2em; margin-bottom: 0; display: table-cell; display: flex; width: 100%; /* For GSoC: */ min-width: 470px; } .nav ul li { display: inline-block; padding: 0; } .nav li.selected { background-color: #222; font-weight: bold; } .nav-right { display: flex; text-align: right; vertical-align: middle; line-height: 0; margin-right: 10px; } .nav-right .share-btn { display: none; } .nav-right .small-share-btn { display: none; } .footer { padding: 2em; border-top: 1px solid #d4d4d4; margin-top: 2em; color: gray; font-size: .9em; } a.heading-anchor { display: inline-block; opacity: 0; width: 1.3em; font-size: 0.7em; margin-left: 0.4em; line-height: 1em; text-decoration: none; transition: opacity 0.3s; } a.heading-anchor:hover, h1:hover a.heading-anchor, h2:hover a.heading-anchor, h3:hover a.heading-anchor, h4:hover a.heading-anchor, h5:hover a.heading-anchor, h6:hover a.heading-anchor { opacity: 1; } @media (min-width: 992px) { .content{ display: flex; } #toc{ display: block!important; align-self: flex-start; width: 300px; position: sticky; top: 20px; left: 0; } .main{ width: calc(100% - 300px); } } .bottom-links { display: flex; justify-content: center; border-top: 1px solid #d4d4d4; margin-top: 30px; padding-top: 25px; } @media all and (min-width: 400px) { .nav-right .share-btn { display: inline-block; } .nav-right .small-share-btn { display: none; } } </style> </head> <body> <div class="container root page-server_sharing"> <div class="header"> <a class="forkme" href="https://github.com/laurent22/joplin"><img src="https://joplinapp.org/images/ForkMe.png"/></a> <a href="https://joplinapp.org"><h1 class="title"><img class="title-icon" src="https://joplinapp.org/images/Icon512.png"><span class="title-text">Joplin</span></h1></a> <p class="sub-title">An open source note taking and to-do application with synchronisation capabilities</p> </div> <div class="nav-wrapper"> <div class="nav"> <ul> <li class=""><a href="https://joplinapp.org/" title="Home"><i class="fa fa-home"></i></a></li> <li><a href="https://discourse.joplinapp.org" title="Forum">Forum</a></li> <li><a class="gsoc" href="https://joplinapp.org/gsoc2021/index/" title="Google Summer of Code 2021">GSoC 2021</a></li> </ul> <div class="nav-right"> <iframe class="share-btn share-btn-github" src="https://ghbtns.com/github-btn.html?user=laurent22&repo=joplin&type=star&count=true" frameborder="0" scrolling="0" width="115px" height="20px"></iframe> </div> </div> </div> <div class="content"> <div id="toc"><ul> <li> <p>Applications</p> <ul> <li><a href="https://joplinapp.org/desktop/">Desktop application</a></li> <li><a href="https://joplinapp.org/mobile/">Mobile applications</a></li> <li><a href="https://joplinapp.org/terminal/">Terminal application</a></li> <li><a href="https://joplinapp.org/clipper/">Web Clipper</a></li> </ul> </li> <li> <p>Support</p> <ul> <li><a href="https://discourse.joplinapp.org">Joplin Forum</a></li> <li><a href="https://joplinapp.org/markdown/">Markdown Guide</a></li> <li><a href="https://joplinapp.org/e2ee/">How to enable end-to-end encryption</a></li> <li><a href="https://joplinapp.org/conflict/">What is a conflict?</a></li> <li><a href="https://joplinapp.org/debugging/">How to enable debug mode</a></li> <li><a href="https://joplinapp.org/rich_text_editor/">About the Rich Text editor limitations</a></li> <li><a href="https://joplinapp.org/faq/">FAQ</a></li> </ul> </li> <li> <p>Joplin API - Get Started</p> <ul> <li><a href="https://joplinapp.org/api/overview/">Joplin API Overview</a></li> <li><a href="https://joplinapp.org/api/get_started/plugins/">Plugin development</a></li> <li><a href="https://joplinapp.org/api/tutorials/toc_plugin/">Plugin tutorial</a></li> </ul> </li> <li> <p>Joplin API - References</p> <ul> <li><a href="https://joplinapp.org/api/references/plugin_api/classes/joplin.html">Plugin API</a></li> <li><a href="https://joplinapp.org/api/references/rest_api/">Data API</a></li> <li><a href="https://joplinapp.org/api/references/plugin_manifest/">Plugin manifest</a></li> <li><a href="https://joplinapp.org/api/references/plugin_loading_rules/">Plugin loading rules</a></li> <li><a href="https://joplinapp.org/api/references/plugin_theming/">Plugin theming</a></li> </ul> </li> <li> <p>Development</p> <ul> <li><a href="https://github.com/laurent22/joplin/blob/dev/BUILD.md">How to build the apps</a></li> <li><a href="https://joplinapp.org/spec/e2ee/">End-to-end encryption spec</a></li> <li><a href="https://joplinapp.org/spec/history/">Note History spec</a></li> <li><a href="https://joplinapp.org/spec/sync_lock/">Sync Lock spec</a></li> <li><a href="https://joplinapp.org/spec/plugins/">Plugin Architecture spec</a></li> <li><a href="https://joplinapp.org/spec/search_sorting/">Search Sorting spec</a></li> <li><a href="https://joplinapp.org/spec/server_file_url_format/">Server: File URL Format</a></li> <li><a href="https://joplinapp.org/spec/server_delta_sync/">Server: Delta Sync</a></li> <li><a href="https://joplinapp.org/spec/server_sharing/">Server: Sharing</a></li> </ul> </li> <li> <p>Google Summer of Code 2021</p> <ul> <li><a href="https://joplinapp.org/gsoc2021/index/">Google Summer of Code 2021</a></li> <li><a href="https://joplinapp.org/gsoc2021/pull_request_guidelines/">How to submit a GSoC pull request</a></li> <li><a href="https://joplinapp.org/gsoc2021/ideas/">Project Ideas</a></li> </ul> </li> <li> <p>About</p> <ul> <li><a href="https://joplinapp.org/changelog/">Changelog (Desktop App)</a></li> <li><a href="https://joplinapp.org/changelog_cli/">Changelog (CLI App)</a></li> <li><a href="https://joplinapp.org/changelog_server/">Changelog (Server)</a></li> <li><a href="https://joplinapp.org/stats/">Stats</a></li> <li><a href="https://joplinapp.org/donate/">Donate</a></li> </ul> </li> </ul> </div> <div class="main"> <p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=E8JMYD2LQ8MMA&lc=GB&item_name=Joplin+Development&currency_code=EUR&bn=PP%2dDonationsBF%3abtn_donateCC_LG%2egif%3aNonHosted"><img src="https://joplinapp.org/images/badges/Donate-PayPal-green.svg" alt="Donate using PayPal"></a> <a href="https://github.com/sponsors/laurent22/"><img src="https://joplinapp.org/images/badges/GitHub-Badge.svg" alt="Sponsor on GitHub"></a> <a href="https://www.patreon.com/joplin"><img src="https://joplinapp.org/images/badges/Patreon-Badge.svg" alt="Become a patron"></a> <a href="https://joplinapp.org/donate/#donations"><img src="https://joplinapp.org/images/badges/Donate-IBAN.svg" alt="Donate using IBAN"></a></p> <hr> <h1>Joplin Server sharing feature<a name="joplin-server-sharing-feature" href="#joplin-server-sharing-feature" class="heading-anchor">🔗</a></h1> <h2>Sharing a file via a public URL<a name="sharing-a-file-via-a-public-url" href="#sharing-a-file-via-a-public-url" class="heading-anchor">🔗</a></h2> <p>Joplin Server is essentially a file hosting service and it allows sharing files via public URLs. To do so, an API call is made to <code>/api/shares</code> with the ID or path of the file that needs to be shared. This call returns a SHAREID that is then used to access the file via URL. When viewing the file, it will display it according to its mime type. Thus by default a Markdown file will be displayed as plain text.</p> <h2>Sharing a note via a public URL<a name="sharing-a-note-via-a-public-url" href="#sharing-a-note-via-a-public-url" class="heading-anchor">🔗</a></h2> <p>It is built on top of the file sharing feature. The file corresponding to the note is shared via the above API. Then a separate application, specific to Joplin, read and parse the Markdown file, and display it as note.</p> <p>That application works as a viewer - instead of displaying the Markdown file as plain text (by default), it renders it and displays it as HTML.</p> <p>The rendering engine is the same as the main applications, which allows us to use the same plugins and settings.</p> <h3>Attached resources<a name="attached-resources" href="#attached-resources" class="heading-anchor">🔗</a></h3> <p>Any resource attached to the note is also shared - so for example images will be displayed, and it will be possible to open any attached PDF. This</p> <h3>Linked note<a name="linked-note" href="#linked-note" class="heading-anchor">🔗</a></h3> <p>Any linked note will <strong>not</strong> be shared, due to the following reasons:</p> <ul> <li> <p>Privacy issue - you don't want to accidentally share a note just because it was linked to another note.</p> </li> <li> <p>Even if the linked note has been shared separately, we still don't give access to it. We don't know who that link has been shared with - it could be a different recipient.</p> </li> </ul> <h3>Multiple share links for a given note<a name="multiple-share-links-for-a-given-note" href="#multiple-share-links-for-a-given-note" class="heading-anchor">🔗</a></h3> <p>It should be possible to have multiple share links for a given note. For example: I share a note with one person, then the same note with a different person. I revoke the share for one person, but I sill want the other person to access the note.</p> <p>So when a share link is created for a note, the API always return a new link.</p> <h2>Sharing a note with a user<a name="sharing-a-note-with-a-user" href="#sharing-a-note-with-a-user" class="heading-anchor">🔗</a></h2> <p>TBD</p> <div class="bottom-links"> <a href="https://github.com/laurent22/joplin/blob/dev/readme/spec/server_sharing.md"> <i class="fa fa-github"></i> Improve this doc </a> </div> <script> function stickyHeader() { return; // Disabled if ($(window).scrollTop() > 179) { $('.nav').addClass('sticky'); } else { $('.nav').removeClass('sticky'); } } $(window).scroll(function() { stickyHeader(); }); (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','https://www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-103586105-1', 'auto'); ga('send', 'pageview'); </script> </div></div> <div class="footer"> Copyright (C) 2016-2021 Laurent Cozic </div> </body> </html>