diff --git a/plugins/scaffolder/src/components/secrets/SecretsContext.test.tsx b/plugins/scaffolder/src/components/secrets/SecretsContext.test.tsx
new file mode 100644
index 0000000000..f238b4be86
--- /dev/null
+++ b/plugins/scaffolder/src/components/secrets/SecretsContext.test.tsx
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, { useContext } from 'react';
+import {
+ useSecretsContext,
+ SecretsContextProvider,
+ SecretsContext,
+} from './SecretsContext';
+import { renderHook, act } from '@testing-library/react-hooks';
+
+describe('SecretsContext', () => {
+ it('should allow the setting of secrets in the context', async () => {
+ const { result } = renderHook(
+ () => ({
+ hook: useSecretsContext(),
+ context: useContext(SecretsContext),
+ }),
+ {
+ wrapper: ({ children }) => (
+ {children}
+ ),
+ },
+ );
+
+ act(() => result.current.hook.setSecret({ foo: 'bar' }));
+ expect(result.current.context?.secrets.foo).toEqual('bar');
+ });
+});
diff --git a/plugins/scaffolder/src/components/secrets/SecretsContext.tsx b/plugins/scaffolder/src/components/secrets/SecretsContext.tsx
new file mode 100644
index 0000000000..0a3358be31
--- /dev/null
+++ b/plugins/scaffolder/src/components/secrets/SecretsContext.tsx
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import React, {
+ useState,
+ useCallback,
+ useContext,
+ createContext,
+ PropsWithChildren,
+} from 'react';
+import { JsonObject } from '@backstage/types';
+
+type SecretsContextContents = {
+ secrets: JsonObject;
+ setSecrets: React.Dispatch>;
+};
+
+/**
+ * The actual context object.
+ */
+export const SecretsContext = createContext(
+ undefined,
+);
+
+/**
+ * The Context Provider that holds the state for the secrets.
+ *
+ * @public
+ */
+export const SecretsContextProvider = ({ children }: PropsWithChildren<{}>) => {
+ const [secrets, setSecrets] = useState({});
+
+ return (
+
+ {children}
+
+ );
+};
+
+/**
+ * Hook to access the secrets context.
+ * @public
+ */
+export const useSecretsContext = () => {
+ const value = useContext(SecretsContext);
+ if (!value) {
+ throw new Error(
+ 'useSecretsContext must be used within a SecretsContextProvider',
+ );
+ }
+
+ const { secrets, setSecrets } = value;
+
+ const setSecret = useCallback(
+ (input: JsonObject) => {
+ setSecrets({ ...secrets, ...input });
+ },
+ [secrets, setSecrets],
+ );
+
+ return { setSecret };
+};
diff --git a/plugins/scaffolder/src/components/secrets/index.ts b/plugins/scaffolder/src/components/secrets/index.ts
new file mode 100644
index 0000000000..2f2cbdf7ac
--- /dev/null
+++ b/plugins/scaffolder/src/components/secrets/index.ts
@@ -0,0 +1,16 @@
+/*
+ * Copyright 2022 The Backstage Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+export { useSecretsContext } from './SecretsContext';