Capture Notes With Drafts Pro
With this #recipe you can create notes on your iOS device, which will automatically be imported into Foam.
Context
Section titled “Context”- You use Foam for VSCode to manage your notes
- You wish to adopt a practice such as A writing inbox for transient and incomplete notes
- You wish to use Drafts Pro to capture quick notes into your Foam notes from your iOS device
Other tools
Section titled “Other tools”- We assume you are familiar with how to use GitHub (if you are using Foam this is implicit)
- You have an iOS device with Drafts
- You have upgraded to Drafts Pro (needed to edit actions).
Instructions
Section titled “Instructions”- Create a new action in Drafts
- Add a single step of type Script
- Edit the script adding the code from the block below
- Edit settings at the top of the script to suit your preferences
- Set other Action options in Drafts as you wish
- Save the Action
- In GitHub create a Personal Access Token and give it
reposcope - make a note of the token - In Drafts create a note
- Select the action you created in steps 1-6
- On the first run you will need to add the following information:
- your GitHub username
- the repository name of your Foam repo
- the GitHub access token from step 7
- An author name
- Check your GitHub repo for a commit
- If you are publishing your Foam to the web you may want to edit your publishing configuration to exclude inbox files - as publishing (and method) is a user choice that is beyond the scope of this recipe
Code for Drafts Action
Section titled “Code for Drafts Action”// adapted from https://forums.getdrafts.com/t/script-step-post-to-github-without-working-copy/3594// post to writing inbox in Foam digital garden
/* * edit these lines to suit your preferences */const inboxFolder = "inbox/"; // the folder in your Foam repo where notes are saved. MUST have trailing slash, except for root of repo use ''const requiredTags = ['inbox']; // all documents will have these added in addition to tags from the Drafts appconst addLinkToInbox = true; // true = created note will have link to [[index]], false = no linkconst addTimeStamp = true; // true = add a note of capture date/time at foot of note
/* * stop editing */
const credential = Credential.create("GitHub garden repo", "The repo name, and its credentials, hosting your Foam notes");credential.addTextField("username", "GitHub Username");credential.addTextField('repo', 'Repo name');credential.addPasswordField("key", "GitHub personal access token");credential.addTextField('author', 'Author');credential.authorize();
const githubKey = credential.getValue('key');const githubUser = credential.getValue('username');const repo = credential.getValue('repo');const author = credential.getValue('author');
const http = HTTP.create(); // create HTTP objectconst base = 'https://api.github.com';
const posttime = new Date();const title = draft.title;const txt = draft.processTemplate("[[line|3..]]");const mergedTags = [...draft.tags, ...requiredTags];const slugbase = title.toLowerCase().replace(/\s/g, "-");
const datestr = `${posttime.getFullYear()}-${pad(posttime.getMonth() + 1)}-${pad(posttime.getDate())}`;const timestr = `${pad(posttime.getHours())}:${pad(posttime.getMinutes())}:00`;const yr = `${posttime.getFullYear()}`;const pdOffset = posttime.getTimezoneOffset();const offsetChar = pdOffset >= 0 ? '-' : '+';var pdHours = Math.floor(pdOffset/60);console.log(pdHours);pdHours = pdHours >= 0 ? pdHours : pdHours * -1;console.log(pdHours);const tzString = `${offsetChar}${pad(pdHours)}:00`;const postdate = `${datestr}T${timestr}${tzString}`;
const slug = `${slugbase}`const fn = `${slug}.md`;let preamble = `# ${title} \n\n`;
mergedTags.forEach(function(item,index){ preamble += `#${item} `; });
if (addLinkToInbox) { preamble += "\n\n[[inbox]]\n";}
preamble += "\n\n";
var doc = `${preamble}${txt}`;
if (addTimeStamp){
doc += `\n\nCaptured: ${postdate}\n`}
const options = { url: `https://api.github.com/repos/${githubUser}/${repo}/contents/${inboxFolder}${fn}`, method: 'PUT', data: { message: `Inbox from Drafts ${datestr}`, content: Base64.encode(doc) }, headers: { 'Authorization': `token ${githubKey}` }};
var response = http.request(options);
if (response.success) { // yay} else { console.log(response.statusCode); console.log(response.error);}
function pad(n) { let str = String(n); while (str.length < 2) { str = `0${str}`; } return str;}LINKS TO THIS PAGE
Recipes
Published with Foam