A workaround I’ve experimented with is using a two-way sync table where the executeUpdate function is a no-op that simply returns the data that was passed in, but there are two issues with this solution:
There’s no way to add new rows to the table, so you would have to know how many rows you’ll need up front & return empty rows from the execute function.
If the user ever presses the “sync” button after making their changes, all their data will be overwritten with whatever is returned from the execute function.
You might try using something like Supabase as a backing store for the data to overcome these obstacles, but that would add a fair amount of complexity.
A much simpler solution would be to publish a doc with the desired table schema in it, then instruct your pack users on how to copy the containing page to their own doc.