Loose Leaf is a notes app for iPad created by Adam Wulf

Related tags

Form loose-leaf
Overview

Overview

Loose Leaf is a notes app for iPad created by Adam Wulf. Learn more and see demo videos at https://getlooseleaf.com. Support this project and download the app on the App Store.

Enjoy the app? Buy me a coffee ☕️ and become a sponsor!

Unique Gestures

Organize pages into documents:

Duplicate pages and scraps with gestures:

Ink sticks to imported images:

Use ruler for straight or curved lines:

Scissors can cut imported images:

More gesture videos available on the Loose Leaf site.

Building Loose Leaf

First, clone the Loose Leaf repository and initialize all submodules:

git clone [email protected]:adamwulf/loose-leaf.git
cd loose-leaf
git submodule update --recursive --init

Next, you'll need to add your own client ids and secrets for MS App Center, Twitter, Facebook, Pinterest, Imgur, and Mixpanel. All of these are stored in a file called AppIds.plist. To get this file setup, copy from the template file:

cp Project/LooseLeaf/AppIds-Template.plist Project/LooseLeaf/AppIds.plist
open Project/LooseLeaf/AppIds.plist

If you don't have ids for some of these services, leaving them blank will still let you build and run the app, though some features may not work.

That's it for configuration - now you can build the app and run it on your iPad!

Get Involved

Help translate Loose Leaf into your language! Join the project and start translating here: https://poeditor.com/join/project/UBaYwL0YTh

Some great places to get involved and help make Loose Leaf better for everyone:

  • Feature #279, #696, and #697 - Add additional share options - destinations like Dropbox, Droplr, and Evernote would be nice additions
  • Feature #1576 Update the ruler tool to act similar to Apple's Notes app and toggle to stay on the page
  • Feature #1618 Support arbitrary page sizes instead of only screen-ratio sized pages
  • Feature #1632 Add optional margin to imported PDFs
  • Bug #1723 - Exporting multiple pages will often crash if the user has more than 10 documents imported. Super sneaky memory corruption bug going on here.

Loose Leaf includes a spacecommander as a submodule to help with keeping code style consistent. Please format all your code before submitting a PR by using the included format-all.sh and format-staged.sh scripts.

More Code

Much of the Loose Leaf codebase is separated into separate submodules:

  1. PerformanceBezier - A small library to dramatically speed up common operations on UIBezierPath, and also bring its functionality closer to NSBezierPath
  2. ClippingBezier - Calculates intersection points, paths, and shapes between two UIBezierPaths
  3. JotUI - OpenGL based drawing view that supports custom brush textures, undo/redo, and asynchronous import and export.
  4. MMStretchGestureRecognizers - A collection of three gestures that can stretch an arbitrary view with four fingers, used in the clone gesture.
  5. cloudkit-manager - A simple wrapper to CloudKit to make passing messages with attachments easy between multiple users
  6. touch-chart - Simplify and smooth UIBezierPaths by reducing the number of elements within the path

Branches

The master branch contains all in-development code. The alpha branch contains the settings used for App Store releases. Each App Store release is tagged. The marketing branch shows hand shadows during gestures and is used to record demo videos.

Icons

Many of the icons used in Loose Leaf were created in PaintCode. Other icons were created with Photoshop. Both *.paintcode and *.psd files are included in the Icons directory.

Extra Applications

This repo also includes two apps used during development of Loose Leaf:

  1. LittleClipper - This app was used to help test the touch-chart and ClippingBezier libraries during the development of the scissors feature.
  2. ShapeShifter - This app demonstrates the use of MMStretchGestureRecognizers and helped to tune the clone scrap/page gesture.

License

The Loose Leaf app and sample code are provided under the MIT License. Attribution is required.

Support This Project

Comments
  • scrap stuck after bezeling many pages quickly

    scrap stuck after bezeling many pages quickly

    1. load up the 100 pages of small data set
    2. select a page from top of list
    3. add new page
    4. insert scrap
    5. hold scrap and bezel quickly through ~20 pages
    6. can no longer bezel to next page after ~15 pages or so. but can still hold/resize/move scrap. cannot pinch to list view, cannot go to next page

    tested in RC1 iOS8 ipad mini

    bug regression_test 
    opened by heatherwong 18
  • make sure to ask for remote notifications, especially if user rejects cloud kit then oks it later

    make sure to ask for remote notifications, especially if user rejects cloud kit then oks it later

    1. new test user
    2. cloud kit share panel
    3. press login button but decline "allow people to find you by email"
    4. enable and allow people to find you by email in Settings app
    5. back to Loose Leaf -> should prompt you for remote notifications

    the remote notifications + cloud kit subscription should be enabled immediately (possibly regardless of cloud kit status?)

    enhancement regression_test CloudKit 
    opened by adamwulf 17
  • MMScrapsOnPaperState.m line 383

    MMScrapsOnPaperState.m line 383

    opened by adamwulf-crashlytics 15
  • MMScrapPaperStackView.m line 1798 - asking to clone a scrap who's state is not yet loaded

    MMScrapPaperStackView.m line 1798 - asking to clone a scrap who's state is not yet loaded

    opened by adamwulf-crashlytics 15
  • MMPageUndoRedoManager.m line 160

    MMPageUndoRedoManager.m line 160

    opened by adamwulf-crashlytics 13
  • Need to investigate: scrap look different in detail and list view

    Need to investigate: scrap look different in detail and list view

    1. Scrap look different in detail and list view

    I seen this in two separate page. Looks like image is somehow zooming in/out?

    CNR consistently - it only happens with specific scraps see screencast http://screencast.com/t/wtlhOJ7Bo1

    tested in iPad 2 iOS 7.1.1 build 0.7.7

    bug regression_test 
    opened by heatherwong 13
  • when a new user logs into cloud kit, it should request remote notifications immediately after asking for cloud kit discoverability

    when a new user logs into cloud kit, it should request remote notifications immediately after asking for cloud kit discoverability

    AT

    1. fresh developer cloud kit container
    2. Delete your app from the device.
    3. Turn the device off completely and turn it back on.
    4. Go to Settings > General > Date & Time and set the date ahead a day or more.
    5. Turn the device off completely again and turn it back on.
    6. login to cloud kit sharing
    7. after prompting for discoverability, after accepting,
    8. should prompt for remote notifications

    its an ugly AT, but that's the only documented way to reset push notification permissions for an app: http://stackoverflow.com/questions/2438400/reset-push-notification-settings-for-app

    bug regression_test 
    opened by adamwulf 12
  • crash when drawing over lots of scraps

    crash when drawing over lots of scraps

    1. add lots of complex scraps
    2. draw and scribble a lot
    3. crash

    I think the issue is that when i draw a line, i am rendering to a lot of different contexts and framebuffers, especially when an element spans multiple scraps.

    I should try and get a test case where i can tap the button to draw 1 element over tons of scraps to see what happens.

    one idea would be to glFlush() between each scrap render (?). i'm pretty sure my data is being generated correctly, since i validate each vertex when it's built.

    logs of crash:

    Thread 0 Crashed:
    0   IMGSGX543GLDriver               0x306df174 sgxTextureGetImageRowBytes(GLDTextureRec*, unsigned int, unsigned int) + 8
    1   IMGSGX543GLDriver               0x306df120 CalculateChunkPlaneSizes(GLDTextureRec*, int, unsigned int*, unsigned int*, unsigned int*, unsigned int*) + 104
    2   IMGSGX543GLDriver               0x306e18c6 sgxConfigureTexturePrivate(GLDTextureRec*) + 82
    3   IMGSGX543GLDriver               0x306e0544 glrUpdateTexture + 616
    4   libGPUSupportMercury.dylib      0x34f0a6b6 gldLoadFramebuffer + 102
    5   GLEngine                        0x32affe52 gleUpdateDrawFramebufferState + 178
    6   GLEngine                        0x32b00dbe gleDoDrawDispatchCore + 126
    7   GLEngine                        0x32a9b468 glDrawArrays_ACC_Exec + 208
    8   LooseLeaf                       0x0012bcc2 -[AbstractBezierPathElement draw] (AbstractBezierPathElement.m:184)
    9   LooseLeaf                       0x0013280a -[JotView renderElement:fromPreviousElement:includeOpenGLPrepForFBO:] (JotView.m:1019)
    10  LooseLeaf                       0x001365b0 -[JotView addElement:] (JotView.m:1620)
    
    bug regression_test 
    opened by adamwulf 12
  • deleting many pages with many scraps quickly will crash in [JotGLContext presentRenderBuffer:]

    deleting many pages with many scraps quickly will crash in [JotGLContext presentRenderBuffer:]

    Found another issue while working on #939

    1. load up the 100 pages of small data set
    2. launch + list view
    3. delete pages one after another quickly.
    4. after ~10 or 20 pages => crash

    currently testing on iOS7, not sure about ios8

    bug no_test 
    opened by adamwulf 11
  • Regression: app crash when bezeling many pages quickly

    Regression: app crash when bezeling many pages quickly

    Regression of #397

    1. start with > 30 pages, many that contain images/scraps
    2. bezel many pages very quickly
    3. app crash

    Actual: seems like bezeling through many pages where image is not done loading will cause app to crash

    tested in build 0.8.1 iPad 2 iOS 7.1.1

    bug no_test 
    opened by heatherwong 11
  • manage undo history with scraps

    manage undo history with scraps

    • [x] Undo drawing across multiple scraps multiple times
    • [x] handle undoing lines that may/note cover scraps that exceed the max stroke size
    • [x] Undo move/size/rotate of a scrap
    • [x] undo adding a scrap to a page
      • drag a scrap from a page to another page -> undo on receiving page -> scrap disappears
    • [x] undo removing a scrap from a page
      • drag a scrap from a page to another page -> undo on original page -> scrap re-appears
    • [x] Properly save undo history to disk somehow #590
      • getting into any undo state -> force quit app -> relaunch -> can still undo
    • [x] undo/redo re-ordering scraps
    • [x] Properly clear out all redo state when a new line is drawn
      • draw on page+scrap -> undo -> draw on page only -> redo -> nothing should happen (bug is line reappears on scrap)
    • [x] undo/redo bezeling a scrap
    • [x] undo/redo adding scrap from bezel #583 #582
    • [x] undo/redo when cloning a scrap
    feature 
    opened by adamwulf 10
  • Web server that serves currently active image

    Web server that serves currently active image

    Providing off-iPad access to the image currently being edited has several use cases, including streaming and recording. I've integrated CocoaHTTPServer in a fairly minimal way, such that accessing the iPad at port 8088 gives access to the page currently being edited, and other pages can be accessed through their location in the filesystem. Since not everyone wants to share their sketches on the local network, so this server is off by default and can be enabled through a setting in Preferences.

    opened by yihchun 0
  • Add more pen colors?

    Add more pen colors?

    Firstly, thanks a lot for this app, it's absolutely phenomenal. Exactly what I imagined I could do when I bought the apple pencil. I'm only sad it took me so long to find it!

    Would you be open to adding more pen colours?

    It'd be even more epic to have a colour wheel as an option, and have maybe 5 of the most recent colours selected from the wheel as "extra" colour pickers. But that's getting really fancy!

    I'd favour having maybe 12 colours if possible.

    opened by chmac 0
  • Optimization opportunity using CAPortalLayer

    Optimization opportunity using CAPortalLayer

    https://medium.com/@avaidyam/caportallayer-7fc81e4fb385

    What these properties allow you to do is “portal” a layer from any process whose context you know of - just like with `CAPluginLayer`. Just send the `CAContext.contextId` over the wire from a friendly process and it’ll render. Unlike `CALayerHost` et al. however, the originating layer will also render on-screen (unless `hidesSourceLayer` is true). How do you get the `sourceLayerRenderId` you might ask? Here’s the function prototype: `NSUInteger CALayerGetRenderId(CALayer *);` – it won’t be hard.
    
    opened by adamwulf 0
Owner
Adam Wulf
Partner at @museapphq. @flexibits alum. Also, maker of @askmeevery, and @getlooseleaf - the gesture driven notes app.
Adam Wulf
Validate that apple-app-site-association files are set up correctly

SwiftAASAValidator Validate that apple-app-site-association files are set up correctly The idea is you can use these functions in your test suite for

Ben Spratling IV 1 Apr 12, 2022
Simple Application that registers Vapor Leaf's .leaf file type to LaunchServices as html enabling automatic syntax highlighting in Xcode.

Vapor Leaf Extension Update: The Vapor Leaf Extension is now meant to be used with the Xcode Plugin I designed to provide Xcode language support for t

Omran Khoja 12 Jun 18, 2022
Standard Notes is a safe place for your notes, thoughts, and life's work

Standard Notes iOS & Android App Standard Notes is a safe place for your notes, thoughts, and life's work. It focuses on being simple, so you don't ha

Standard Notes 842 Dec 31, 2022
Spiro - Swift Playgrounds 4 app created on the iPad

Spiro Swift Playgrounds 4 app created on the iPad^. ^ Xcode also used as explain

An Trinh 47 Nov 18, 2022
Swift Playgrounds 4 app created on the iPad

Spiro Swift Playgrounds 4 app created on the iPad^. ^ Xcode also used as explained below. ?? Screenshots ?? What is Spiro? An interactive animating sp

An Trinh 26 Jan 6, 2022
Daydreamer - A Figma viewer created in Swift Playgrounds for iPad

Daydreamer A native Figma client for iPad, created exclusively using Swift Playg

featherless 3 Feb 18, 2022
SwiftUI - iOS notes App that integrates Core Data with SwiftUI App Life Cycle

Devote (Notes App) SwiftUI Masterclass project Integration between Core Data and SwiftUI App Life Cycle Custom Toggle style and checkbox Read, Update

Arthur Neves 3 Sep 3, 2022
A functional, simplistic quick notes app, built in Swift for iOS

iOS QNApp Documentation Built for iOS 14 and above in XCode 13.1 Takes user input and stores in a note, can be modified at any time Dark mode and acce

itbarsoum 0 Jan 3, 2022
Notes App using Core Data for persisting the data ✨

Notes Notes app where we can save and manage our daily notes. App usage The app allow us to add new notes We can delete our existing notes We can edit

Chris 0 Nov 13, 2021
Manipulates the undocumented interchange format for the Apple Notes app.

NotesArchive A Swift package for reading and writing an undocumented interchange format for the Apple Notes app in macOS 12 Monterey1. Enabling the De

Zachary Waldowski 7 Jul 5, 2022
A note on the Construction of the watchOS App Notes

This document is a note on the Construction of the watchOS App "Notes" Learn about the main topics of this watchOS project In this SwiftUI tutorial, w

Daniel Beatty 0 Dec 6, 2021
Simple IOS notes app written programmatically without storyboard using UIKit and CoreData

Notes Simple Notes app. Swift, UIKit, CoreData Description Simple IOS notes app

null 4 Dec 23, 2022
OnTime - OnTime App is for Scheduling your day and prioritizing your task and also for saving notes

OnTime OnTime App is for Scheduling your day and prioritizing your task and also

Mohammed Sulaiman 1 Jan 7, 2023
Presentation helps you to make tutorials, release notes and animated pages.

Presentation helps you to make tutorials, release notes and animated pages.

HyperRedink 3k Dec 28, 2022
content for Using Combine - notes on learning Combine with UIKit and SwiftUI

SwiftUI-Notes A collection of notes, project pieces, playgrounds and ideas on learning and using SwiftUI and Combine. Changes, corrections, and feedba

Joseph Heck 1.7k Dec 27, 2022
Presentation helps you to make tutorials, release notes and animated pages.

Presentation helps you to make tutorials, release notes and animated pages.

HyperRedink 3k Jan 5, 2023
BucketServer - Small API with SQLite database that saves notes for an iOS appliction called Bucket list

BucketList Server-Side Small API with SQLite database that saves notes for an iO

null 0 Dec 30, 2021
Mvvm - Collection View Notes With Swift

CollectionViewNotes Haciendo apuntes para cuando pierda la memoria Comenzando ??

null 0 Jan 13, 2022
A Swift script to create a list of links to release notes for package updates.

spi-release-notes release-notes is a Swift script that creates a list of links to release notes for package updates. Running release-notes performs a

Swift Package Index 14 Jul 20, 2022
IOS-Swift-Notes-EssentialDeveloper-Mentoring - Live Mentoring Essential Developer about Composition Root

iOS-Swift-Notes-EsentialDeveloper-Mentoring Problem How to manage massive compos

Arifin Firdaus 1 Jun 1, 2022