 <p>one thing that is missing is the <code>authorize</code> function in the directive, which is required (see the <a href="https://atmospherejs.com/edgee/slingshot" rel="nofollow">API</a>) so add</p> <pre><code>Slingshot.createDirective("Test", Slingshot.S3Storage, { bucket: "test", acl: "public-read", authorize: function () { // do some validation // e.g. deny uploads if user is not logged in. if (!this.userId) { throw new Meteor.Error(403, "Login Required"); } return true; }, key: function (file) { return file.name; } }); </code></pre> <p>Please note that also <code>maxSize</code> and <code>allowedFileTypes</code> are required, so you should add to client and server side code (e.g. in lib/common.js)</p> <pre><code>Slingshot.fileRestrictions("Test", { allowedFileTypes: ["image/png", "image/jpeg", "image/gif"], maxSize: 10 * 1024 * 1024 // 10 MB (use null for unlimited) }); </code></pre> <p>hope that helps.</p>