 				}
 
 	_compileAsUser: (req, callback) ->
+		# callback with user_id if isolated flag is set on request, undefined otherwise
 		isolated = req.query?.isolated is "true"
 		if isolated
-			AuthenticationController.getLoggedInUserId req, callback
-		else
-			callback()
+			AuthenticationController.getLoggedInUserId req, callback # -> (error, user_id)
+		else
+			callback() # do a per-project compile, not per-user
+
+	_downloadAsUser: (req, callback) ->
+		# callback with user_id if isolated flag or user_id param is set on request, undefined otherwise
+		isolated = req.query?.isolated is "true" or req.params.user_id?
+		if isolated
+			AuthenticationController.getLoggedInUserId req, callback # -> (error, user_id)
+		else
+			callback() # do a per-project compile, not per-user
 
 	downloadPdf: (req, res, next = (error) ->)->
 		Metrics.inc "pdf-downloads"

					logger.log project_id:project_id, ip:req.ip, "rate limit hit downloading pdf"
					res.send 500
				else
					CompileController.proxyToClsi(project_id, "/project/#{project_id}/output/output.pdf", req, res, next)

	deleteAuxFiles: (req, res, next) ->
		project_id = req.params.Project_id

				return next(error) if error?
				res.sendStatus(200)

	# this is only used by templates, so is not called with a user_id
	compileAndDownloadPdf: (req, res, next)->
		project_id = req.params.project_id
		# pass user_id as null, since templates are an "anonymous" compile
		CompileManager.compile project_id, null, {}, (err)->
			if err?
				logger.err err:err, project_id:project_id, "something went wrong compile and downloading pdf"
				res.sendStatus 500
			url = "/project/#{project_id}/output/output.pdf"
			CompileController.proxyToClsi project_id, url, req, res, next

	getFileFromClsi: (req, res, next = (error) ->) ->
		project_id = req.params.Project_id
		CompileController._downloadAsUser req, (error, user_id) ->
			return next(error) if error?
			url = CompileController._getFileUrl project_id, user_id, req.params.build_id, req.params.file
			CompileController.proxyToClsi(project_id, url, req, res, next)

	# compute a GET file url for a given project, user (optional), build (optional) and file
	_getFileUrl: (project_id, user_id, build_id, file) ->
		if user_id? and build_id?
			url = "/project/#{project_id}/user/#{user_id}/build/#{build_id}/output/#{file}"
		else if user_id?
			url = "/project/#{project_id}/user/#{user_id}/output/#{file}"
		else if build_id?
			url = "/project/#{project_id}/build/#{build_id}/output/#{file}"
		else
			url = "/project/#{project_id}/output/#{file}"
		return url

	# compute a POST url for a project, user (optional) and action
	_getUrl: (project_id, user_id, action) ->
		path = "/project/#{project_id}"
		path += "/user/#{user_id}" if user_id?
