
Setting up your project
Creating a Writer app and getting your API key
From the Home screen, click on Build an app.

Creating the application
Next, open your terminal and navigate to the directory where you want to create your application directory.Set the API key environment variable
To pass your API key to the Writer Framework, you’ll need to set an environment variable called
WRITER_API_KEY. Here’s how you can set this variable in your terminal session:Clone the application
Run the following command to clone the
framework-tutorials repo and navigate to the folder containing the starting point for this application.Edit your project
To edit your project, run the following commands. This will bring up the console, which displays Framework-wide messages and errors, including logs from the API. By default, the Writer Framework Builder is accessible at
localhost:4005. If this port is in use, you can specify a different port. Open this address in your browser to view your default application setup.Introduction to the application setup
The template includes some basic code, UI setup, and files to help you get started.Included files
The filesprompts.py and html_template.py contain helper functions for generating prompts for the AI model and formatting the output HTML, respectively.
In the sample-input folder, you’ll find a sample CSV file that you can use to test the application.
Finally, the custom.css file in the static folder contains custom CSS styles for the application.
Dependency imports
Inmain.py, you’ll see that the dependencies are already imported at the top:
Initial UI
The template includes a basic UI setup, including a Page component with a Header component. The Header component also includes an Image. If you want to change the logo image, you can replace thelogo_image_path variable in the state with the path to your desired image in the static folder.
Initializing the application state
First, inmain.py, set up the initial state for the application. This state will store the application’s title, logo image path, file data, metrics, and processing status for each step. You’ll also import a custom CSS file to style the application and create a placeholder DataFrame.
Building the file upload functionality
First, you’ll build the file upload feature. Note thatprompts.py, html_template.py, and custom.css are provided in the starting point for the application. There is also a sample CSV file in the sample-input folder that you can use to test the application.
Implementing the file upload handler
To handle file uploads, you’ll create a function inmain.py that reads the uploaded CSV file, processes the data, and stores it in the application state.
Implementing a file upload handler
In
main.py, create a function to handle file uploads. This function will read the uploaded CSV file, process the data, and store it in the application state.Displaying the uploaded CSV file
Next, you’ll display the uploaded CSV file in the application UI.Creating a Step Container
Add a Step Container component to the Page. This will contain the two steps for the application.
Create Step components
Drag two Step components into the Step Container. Name the first one “Load CSV file” and the second “Release notes”.
Configure first Step component
Click on the the first Step component to select it and bring up the Properties pane. Set “Completed” to
@{step1.completed}. This state reference will contain either “yes” or “no” based on the completion status of the step.Add Message component
Within this Step, add a Message component with the message set to
@{step1.processing-message}. Scroll down to the Visibility section of the settings. Select “Custom” and set the condition to step1.processing-message.Create three-column layout
Add a Column Container component and add three Column components. For the first column, set the width to 0.5. For the third column, set “Content alignment (H)” to “Left” and “Content alignment (V)” to “Bottom.”
Add file input
In the middle column, place a File Input component labeled “Please upload your CSV file”. Set its
wf-file-change handler to onchangefile_handler.Add generate button
In the third column, add a Button labeled “Generate release notes”. Set its “Disabled” property to
@{step1.generate-button-state} and its “Icon” property to laps.
sample-input/test-data.csv, the Raw CSV section will display the uploaded CSV file:

Generating release notes
Now that you’ve set up the file upload functionality, you can generate release notes based on the uploaded CSV file.Defining text completion functions
Using the prompts provided, define functions to get the category, release notes summary, and release notes description using AI completion. You’ll use these functions to process the uploaded CSV file and generate release notes.Implementing the generate functionality
You’ll next implement the ability to process the CSV and generate release notes.Implement generate button handler
Next, create a function to handle the generate button click. This function will process the uploaded CSV file, generate release notes, and store the formatted output in the application state.
Displaying the release notes
Now that you’ve generated the release notes, you can display them in the application UI.Implementing helper functions
Define helper functions to handle back button clicks, write HTML to a file and download the HTML file.Building the initial release notes UI
Next, you’ll build the UI for the “Release notes” step.Select 'Release notes' Step
To display the Release notes Step component, you’ll need to double-click on it.
Add Columns components
Below the Separator, add a Column Container component and a single Column component.
Buiding tabs for Release notes display
Below the Back button, add a Tab Container component and two Tab components. Name them “Formatted release notes” and “Release notes”.Formatted release notes tab
In the first tab, you’ll display the formatted release notes.Add HTML component
In the first tab, add an HTML Element component. Set the “Element” property Finally, set the “HTML inside” property to
div and the “Styles” property to the following object:@{step2.formatted-release-notes}.Create three-column layout
Inside thie HTML Element component, create a three-column layout using a Column Container component and three Column components.
Add Metric components
In each column, add three Metric components to display new features, caveats, and fixed issues, respectively.
Set the “Name” of these components to a single space to remove the placeholder text:
. Then, set the values of these components to @{metrics.new_features}, @{metrics.caveats}, and @{metrics.fixed_issues}. Finally, set the “Note” text to “+New Features”, “+Caveats”, and “+Fixed Issues” respectively. The ”+” sign will display styling that indicates a positive message.
Release notes tab
Finally, you’ll add a Dataframe component to the second tab to display the detailed release notes.Add Metric component
In the second tab, start with a Metric component to show the total number of release notes generated. Set the “Name” to “Number of release notes generated” and the “Value” to
@{metrics.total}. Delete the default value for “Note”.
framework-tutorials/release-notes-generator/end in the tutorials repo you cloned at the beginning of the tutorial.