Loom for Iconfactory Tapestry
Create connectors for Tapestry
Only for Mac
Free
Loom lets you create connectors for Iconfactory Tapestry.
On iOS, Tapestry weaves your favorite blogs, social media, and more into a unified and chronological timeline.
Tapestry uses connectors to retrieve the items for a timeline. Each connector is a collection of files that describes a type of feed and provides instructions on how to load and parse it. A connector is the glue between a feed source and the rest of the app.
Connectors are created with standard web technologies: JavaScript and JSON. All of Tapestry’s connectors are open source and easy to adapt for your needs.
This app allows you to test and debug your own connectors.
Tapestry Loom loads and displays content just like on iOS, but adds a web inspector that lets you see what’s going on during processing. You can also check configuration parameters, change feed variables, and view item metadata. And since you’re working on a Mac, you can easily use your favorite text editor, version control, and any other tools that you may need.
The API used by Tapestry is fully documented on GitHub. We highly recommend taking a look at the tutorial before creating your first connector.
https://github.com/TheIconfactory/Tapestry
more • Updated to Iconfactory Tapestry 1.9 API
• Added a new discovery rule that can match based on DNS TXT records (used by social.bsky.account)
2.0.10 4d ago
• Updated to Iconfactory Tapestry 1.8 API
• Added `site_default` which lets you provide a default value for `site` rather than just placeholder text in the textfield
• Added a new discovery rule `nodeinfo` for checking `software` or `protocol` via the Fediverse's `/.well-known/nodeinfo` mechanism
2.0.9 Apr 7
• Updated to Iconfactory Tapestry 1.7 API
• New feature for HTML discovery rules to match tag content:
- Omit the `check` property to match against HTML tag content rather than an attribute value
• New discovery rule called `input`:
- Allows for users to type things like bare usernames or Reddit subreddits into Feed Finder and translate them to feeds
- Transforms any kind of bare string input a user might submit to Feed Finder into a potential url via a template
- The URL is then tested against your connector's other rules in the usual way
- Used by: org.joinmastodon.account, social.bsky.account, com.youtube, com.reddit, com.reddit.account
• The new "Connector Finder" makes it easier to share your connectors:
- No need to export a .tapestry file
- Link directly to your Github repository
- Direct users to install or upgrade using a URL scheme
- tapestry://add-connector?url=[your-percent-encoded-url-goes-here]
2.0.8 Feb 23
• Added API compatibility for Iconfactory Tapestry 1.6
• Automatic attachment extraction now respects `hidden_tag_classes` and skips over tags with the given CSS class names
• The detail view now also respects `hidden_tag_classes` by applying `display: none` CSS rule to them
• Feed Finder now checks the XML and JSON discovery rules (if any) before the HTML discovery rules
- Previously the HTML discovery rules were checked first
- Our HTML parser for this is very permissive and will happily accept XML as if it were HTML whereas the inverse is not true
- In rare cases, the RSS connector managed to match an HTML rule to a tag within the XML content of a feed and extracted the wrong feed url
- Flipping the rule order worked around this while hopefully not subtly breaking any other connector discovery rules
2.0.7 12/16/2025
• Support for developing connectors for Tapestry 1.4
- Loom can now handle newer APIs
- Note that actions are not yet available to test directly within Loom
• Added support for "context" actions:
- Useful for displaying ephemeral conversation thread timelines
- Add an action with `"role": "context"` to your "actions.json" file
- Attach the new action to the Items returned via `processResults()` as usual
- Can now return an array of Item objects from `performAction()`
- Requires minimum_app_version 1.4 or higher
• When tapping on an Item attachment in Tapestry that has a `context` action, the action is performed instead of opening the URL:
- Useful for quote attachments to open a conversation thread in-app
- Used by the Mastodon connectors for native quote posts
2.0.6 10/20/2025
IMPROVEMENTS
• Changed `xmlParse()`, `plistParse()`, and `extractProperties()` connector functions to be conditionally async
• Added a new connector function `sendConditionalRequest()` to avoid downloading content unnecessarily when it makes sense
• Added support for a new connector config option "synchronizable_credentials"
• Changed the new `sendConditionalRequest()` function to require "minimum_app_version" of 1.3
• Subtly adjusted the format of the JSON Tapestry sends during JWT authorization because some servers aren't following the spec
• Connector support for importing quote posts by adding an item object to the attachments array
• Added first class support for poll results
• Added a way to hide certain HTML tags with specific classes when rendering timeline previews
• Connector console.log() messages are now logged to the Event Log when Advanced Settings > Debugging Mode is enabled in Tapestry
• Fixed problems catching errors when connector functions were declared async
EXPANDED NOTES
New function `sendConditionalRequest()`:
- Available when "minimum_app_version" is set to "1.3
- Async function (returns a Promise)
- Supports the same parameters as `sendRequest()`
- Returns early with `null` if the server replies with a "304 Not Modified" allowing you to skip processing unchanged items
- Internally tracks last-modified and/or etag headers from supporting servers
- State is stored the same as using `setItem()` and `getItem()`, but keyed by the request's URL
- It is still your script's responsibility to call `processResults()` when this function returns `null`
Added support for item attachments:
- Useful for handling quote posts
- Supplied via an item's attachments array along with media and links
- Create using Item.createWithUriDate() as usual, but add it to the host item's attachments
- Currently rendered as a link attachment in Tapestry, but eventually they'll have better timeline styling
- Loom does not currently render these correctly
Added support for poll attachments:
- Presents poll results in a richer way in the timeline
- Add to an item's attachments array
- Created using PollAttachment.create() and PollOption.create()
- Loom does not currently render these correctly
New plugin configuration option: "synchronizable_credentials":
- Prevent a feed's authentication tokens from syncing using iCloud keychain when set to `false`.
- Useful for services like Bluesky and Tumblr with frequent token refreshes that don't play nice with iCloud keychain sync
- Boolean value - default is `true` if omitted
New plugin configuration option: "hidden_tag_classes":
- Hides HTML tags from the item's preview if they have one of the named CSS classes
- Used by the Mastodon and RSS/JSON connectors to hide some unnecessary elements
- Array of string CSS class names
Connector utility functions are now async:
- xmlParse()
- plistParse()
- extractProperties()
These functions now return a Promise if your connector's "plugin-config.js" file sets "minimum_app_version" to "1.3" (or higher).
If your connector does not specify a "minimum_app_version" or is set to something lower, the functions will continue to block the shared Javascript thread as they do their work and thus slow down all other connectors during refresh.
We strongly encourage you to upgrade your scripts to use async/await and set your "minimum_app_version" to "1.3" - we plan to eventually deprecate the synchronous versions of these functions in a future release which may cause your scripts to break if you use them.
Bug fix: Connector functions called by Tapestry (`load()`, `verify()`, and `perform()`) should now correctly catch exceptions even when they are declared as `async`. Non-async declarations will still work, too. In either case, you must still call `processResults()` or `processVerification()` or `processError()` so Tapestry knows when the script is done.
2.0.5 09/30/2025
• Symlinks in connector are now resolved when saving a connector
• Added support for resources folder and new require() function
• Improved connector selection when switching folders
• Added support for actions:
- New gear icon at the bottom of Results panel
- Shows the actions available on the selected item
- Actions in menu will be shown in ⋯ menu of iOS app
- Item actions and values are also displayed by the document icon in the Preview panel
• Information sheets (document icon) are now wider
• Web Inspector and logging improvements:
- Loaded scripts are now named (e.g. "plugin.js")
- Breakpoints in scripts are now maintained across loads
- Exceptions now include a stack trace with line numbers
- Emoji in logged output!
• Added support for raiseCondition() function
• Added an "Open Item in App" button in Item panel: shows the URL that will be used for each configured app
2.0.4 05/20/2025
• Added lossy UTF-8 conversion when parsing responses (instead of getting an invalid encoding error)
• Fixed display of post author avatars to match iOS app
• Fixed a potential crash during automatic update
• Fixed an issue with unnecessary reloads during automatic update
• Updated load date checks to match iOS app
• Updated Feed Finder test to use multiple matches in URL variable
• Updated suggestions to handle multiple variables
• A folder with a single connector that has a bad identifier now reports an error [Thanks Pipe!]
• Updated copyright dates
• Web Inspector will now display script syntax errors during verify
2.0.3 04/08/2025
• Tapestry Loom now monitors your connectors folder for changes and reloads if a change is detected. Save in your editor and all changes will appear in the UI automatically.
• Added "Automatically Reload Connectors" to File menu to enable/disable the feature
• Fixed an issue where connectors would not refresh when switching folders
• Version number is now shown in Connector panel
• Added a warning when the connector id doesn't match its folder name (and is not loaded) [Thanks John!]
• All OAuth token requests now get an "Accept: application/json" header [Thanks James!]
• Added an experimental recursive check in Feed Finder test dialog
2.0.2 02/26/2025
• The contentWarning property is now displayed in item metadata
• Feeds returning ISO Latin characters like it's 1999 are now handled correctly [Thanks Mikkel!]
• Added support for fullResponse in sendRequest()
• Fixed layout of preview for post author
• Feed Finder improvements from iOS
2.0.1 02/17/2025
• Updated to Iconfactory Tapestry 1.9 API
• Added a new discovery rule that can match based on DNS TXT records (used by social.bsky.account)
more Version 2.0.10 4d ago
Data Not Collected The developer does not collect any data from this app.